Compare commits

...

8 Commits

Author SHA1 Message Date
Mikita Wiśniewski 2552e92b14 Prepare branch for merge pt. 2
update README with new info (including credits) and update links in it, fix formatting in misc.lua
2023-04-22 08:48:40 +07:00
Mikita Wiśniewski 457237049b Prepare branch for merge pt. 1 (fixes #21)
update locales, fix use_texture_alpha = 'clip' warnings, fix birch slab tables (we didn't have those apparently XD)
2023-04-22 08:07:44 +07:00
Mikita Wiśniewski 90375c9d4d Add functional for the ovens (fixes #17)
currently it is just a retextured smoker without particles, but I'll add more result slots before releasing (I hope)
2023-04-22 07:30:21 +07:00
Mikita Wiśniewski df843ca7a5 Add .gitignore and oven textures
these textures are currently unused, but they soon will be used for the ovens themselves
2023-04-16 14:15:21 +07:00
Mikita Wiśniewski 380be28114 Add About section to the README with a Wiki link (fixes #19)
yay
2023-04-16 08:37:43 +07:00
Mikita Wiśniewski 19211d7c24 Add support for mcl_bamboo (fixes #20) 2023-04-15 20:51:28 +07:00
Mikita Wiśniewski a12dc3f8aa Oops
forgot to fix one of those in previous commit
2023-04-15 19:32:43 +07:00
Mikita Wiśniewski 53b93aec4e Fix crimson and warped textures (fixes #18) 2023-04-12 21:49:31 +07:00
15 changed files with 630 additions and 11 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
textures/src/**

View File

@ -7,6 +7,26 @@ Adds more decoration and furniture blocks to MineClone 2
## About
This mod adds various blocks into the game so you can decorate your house, office or whatever you're building in MineClone!
Added blocks are:
* Armchairs
* Chairs
* Tables
* Dyed Planks
* Paths
* Hedges
* Curtains
* Coalquartz Tile
* Table Lamp
* Oven
* **and more are planned!**
Want to read more? [Check out the Wiki!](https://git.minetest.land/rudzik8/mcl_decor/wiki)
## Contributing (how can I help?)
### Translate the mod
@ -35,14 +55,19 @@ Media licensed under CC-BY-SA 4.0, see [this deed](https://creativecommons.org/l
## Credits
**For assets:**
- [Coalquartz Tile texture](textures/mcl_decor_coalquartz_tile.png) uses [coal block](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_core/textures/default_coal_block.png) and [quartz block](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_side.png) textures under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (combined)
- [Dyed planks template texture](textures/mcl_decor_dyed_planks.png) uses [oak planks](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_core/textures/default_wood.png) texture under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (desaturated and lighted up a bit from original)
- [Table Lamp texture](textures/mcl_decor_table_lamp.png) uses [red wool](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_wool/textures/wool_red.png), [black wool](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_wool/textures/wool_black.png), [torch](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_torches/textures/default_torch_on_floor.png), [smooth stone](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png) and [oak tree](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_core/textures/default_tree.png) textures under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (combined and resized)
- [Curtains overlay texture](textures/mcl_decor_curtain_overlay.png) uses [top iron pane](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/xpanes/textures/xpanes_top_iron.png) texture under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (resized)
- [Coalquartz Tile texture](textures/mcl_decor_coalquartz_tile.png) uses [coal block](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/default_coal_block.png) and [side quartz block](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_nether/textures/mcl_nether_quartz_block_side.png) textures under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (combined)
- [Dyed planks template texture](textures/mcl_decor_dyed_planks.png) uses [oak planks](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/default_wood.png) texture under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (desaturated and lighted up a bit from original)
- [Table Lamp texture](textures/mcl_decor_table_lamp.png) uses [red wool](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/wool_red.png), [black wool](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_wool/textures/wool_black.png), [torch](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_torches/textures/default_torch_on_floor.png), [smooth stone](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_stairs/textures/mcl_stairs_stone_slab_top.png) and [oak tree](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_core/textures/default_tree.png) textures under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (combined and resized)
- [Curtains overlay texture](textures/mcl_decor_curtain_overlay.png) uses [top iron pane](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/xpanes_top_iron.png) texture under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (resized)
- [Oven front texture](textures/mcl_decor_oven_front.png) uses [top quartz block](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/mcl_nether_quartz_block_top.png), [obsidian](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/default_obsidian.png) and [glass](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/default_glass.png) textures under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (combined and resized)
- [Oven front active texture](textures/mcl_decor_oven_front_active.png) uses [top quartz block](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/mcl_nether_quartz_block_top.png), [obsidian](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/default_obsidian.png) and [glass](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/default_glass.png) textures under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (combined and resized)
- [Oven side texture](textures/mcl_decor_oven_side.png) uses [top quartz block](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/mcl_nether_quartz_block_top.png) and [obsidian](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/default_obsidian.png) textures under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (combined and resized)
- [Oven top texture](textures/mcl_decor_oven_top.png) uses [obsidian](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/textures/default_obsidian.png) texture under [CC-BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) by [XSSheep](https://github.com/XSSheep) (slightly modified)
**For code:**
- Sitting function (in api.lua) uses code from [ts_furniture mod](https://content.minetest.net/packages/Thomas-S/ts_furniture/) under [MIT](https://spdx.org/licenses/MIT.html) by [Thomas-S](https://content.minetest.net/users/Thomas-S/)
- Oven code (oven.lua) uses code from [mcl_smoker](https://git.minetest.land/MineClone2/MineClone2/src/branch/master/mods/ITEMS/mcl_smoker) under [LGPLv2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1-standalone.html) by [Wuzzy](https://wuzzy.codeberg.page/) and [PrairieWind](https://prairiewind.codeberg.page/)
**Misc:**

View File

@ -102,6 +102,7 @@ for _, row in ipairs(mcl_decor.colors) do
wooltile..".png".."^mcl_decor_curtain_overlay.png^[transformFY",
wooltile..".png".."^mcl_decor_curtain_alpha.png^[makealpha:255,126,126^mcl_decor_curtain_overlay.png",
},
use_texture_alpha = "clip",
stack_max = 64,
inventory_image = wooltile..".png".."^mcl_decor_curtain_alpha.png^[makealpha:255,126,126^mcl_decor_curtain_overlay.png",
wield_image = wooltile..".png".."^mcl_decor_curtain_alpha.png^[makealpha:255,126,126^mcl_decor_curtain_overlay.png",
@ -133,6 +134,7 @@ for _, row in ipairs(mcl_decor.colors) do
wooltile..".png".."^mcl_decor_curtain_overlay.png^[transformFY",
wooltile..".png".."^mcl_decor_curtain_overlay.png",
},
use_texture_alpha = "clip",
walkable = false,
sunlight_propagates = true,
drawtype = "nodebox",

View File

@ -9,4 +9,5 @@ dofile(modpath.."/wooden.lua")
dofile(modpath.."/colored.lua")
dofile(modpath.."/paths.lua")
dofile(modpath.."/hedges.lua")
dofile(modpath.."/oven.lua")
dofile(modpath.."/misc.lua")

View File

@ -23,6 +23,7 @@ Spruce Chair=Chaise en Sapin
Mangrove Chair=Chaise en Palétuvier
Crimson Chair=Chaise Carmin
Warped Chair=Chaise Biscornue
Bamboo Chair=
Oak Table=Table en Chêne
Acacia Table=Table en Acacia
Birch Table=Table en Bouleau
@ -32,6 +33,7 @@ Spruce Table=Table en Sapin
Mangrove Table=Table en Palétuvier
Crimson Table=Table Carmin
Warped Table=Table Biscornue
Bamboo Table=
Oak Slab Table=Table Basse en Chêne
Dark Oak Slab Table=Table Basse en Chêne Noir
Jungle Slab Table=Table Basse en Acajou
@ -41,6 +43,7 @@ Birch Slab Table=Table Basse en Bouleau
Mangrove Slab Table=Table Basse en Palétuvier
Crimson Slab Table=Table Basse Carmin
Warped Slab Table=Table Basse Biscornue
Bamboo Slab Table=
Oak Hedge=Haie de Chêne
Dark Oak Hedge=Haie de Chêne Noir
Jungle Hedge=Haie d'Acajou
@ -96,6 +99,7 @@ Brown Curtains=Rideaux Marron
Pink Curtains=Rideaux Rose
Lime Curtains=Rideaux Vert Clair
Light Blue Curtains=Rideaux Bleu Clair
Oven=
Stair= Escalier
Slab= Dalle
Double=Double

View File

@ -23,6 +23,7 @@ Spruce Chair=Еловый стул
Mangrove Chair=Мангровый стул
Crimson Chair=Багровый стул
Warped Chair=Искажённый стул
Bamboo Chair=Бамбуковый стул
Oak Table=Дубовый стол
Acacia Table=Стол из акации
Birch Table=Берёзовый стол
@ -32,6 +33,7 @@ Spruce Table=Еловый стол
Mangrove Table=Мангровый стол
Crimson Table=Багровый стол
Warped Table=Искажённый стол
Bamboo Table=Бамбуковый стол
Oak Slab Table=Дубовый полублочный стол
Dark Oak Slab Table=Полублочный стол из тёмного дуба
Jungle Slab Table=Полублочный стол из тропического дерева
@ -41,6 +43,7 @@ Birch Slab Table=Берёзовый полублочный стол
Mangrove Slab Table=Мангровый полублочный стол
Crimson Slab Table=Багровый полублочный стол
Warped Slab Table=Искажённый полублочный стол
Bamboo Slab Table=Бамбуковый полублочный стол
Oak Hedge=Дубовая живая изгородь
Dark Oak Hedge=Живая изгородь из тёмного дуба
Jungle Hedge=Живая изгородь из тропического дерева
@ -96,6 +99,7 @@ Brown Armchair=Коричневые шторы
Pink Armchair=Розовые шторы
Lime Armchair=Зелёные лаймовые шторы
Light Blue Armchair=Светло-голубые шторы
Oven=Духовка
Stair= Ступенька
Slab= Плита
Double=Двойная

View File

@ -23,6 +23,7 @@ Spruce Chair=
Mangrove Chair=
Crimson Chair=
Warped Chair=
Bamboo Chair=
Oak Table=
Acacia Table=
Birch Table=
@ -32,6 +33,7 @@ Spruce Table=
Mangrove Table=
Crimson Table=
Warped Table=
Bamboo Table=
Oak Slab Table=
Dark Oak Slab Table=
Jungle Slab Table=
@ -41,6 +43,7 @@ Birch Slab Table=
Mangrove Slab Table=
Crimson Slab Table=
Warped Slab Table=
Bamboo Slab Table=
Oak Hedge=
Dark Oak Hedge=
Jungle Hedge=
@ -96,6 +99,7 @@ Brown Curtains=
Pink Curtains=
Lime Curtains=
Light Blue Curtains=
Oven=
Stair=
Slab=
Double=

View File

@ -4,8 +4,8 @@ local S = minetest.get_translator(minetest.get_current_modname())
--- Coalquartz Tile ---
minetest.register_node("mcl_decor:coalquartz_tile", {
description = S("Coalquartz Tile"),
tiles = {"mcl_decor_coalquartz_tile.png"},
description = S("Coalquartz Tile"),
tiles = {"mcl_decor_coalquartz_tile.png"},
is_ground_content = false,
groups = {pickaxey=1, flammable=1, quartz_block=1, building_block=1, material_stone=1, fire_encouragement=5, fire_flammability=5},
sounds = mcl_sounds.node_sound_stone_defaults(),
@ -34,6 +34,7 @@ mcl_stairs.register_stair_and_slab_simple("coalquartz_tile", "mcl_decor:coalquar
minetest.register_node("mcl_decor:table_lamp", {
description = S("Table Lamp"),
tiles = {"mcl_decor_table_lamp.png"},
use_texture_alpha = "clip",
drawtype = "mesh",
mesh = "mcl_decor_table_lamp.obj",
paramtype = "light",

View File

@ -1,5 +1,5 @@
title = MineClone2 Furniture and decorations
name = mcl_decor
description = Adds more decoration and furniture blocks to MineClone 2
depends = mcl_core, mcl_torches, mcl_player, mcl_sounds, mcl_dye, mcl_nether, mcl_stairs, mcl_title, mcl_fences, mcl_mangrove, mcl_deepslate, mcl_crimson
depends = mcl_core, mcl_torches, mcl_player, mcl_sounds, mcl_dye, mcl_nether, mcl_stairs, mcl_title, mcl_fences, mcl_mangrove, mcl_deepslate, mcl_crimson, mcl_bamboo
optional_depends = mcl_cozy

574
oven.lua Normal file
View File

@ -0,0 +1,574 @@
local S = minetest.get_translator(minetest.get_current_modname())
local LIGHT_ACTIVE_FURNACE = 13
--
-- Formspecs
--
local function active_formspec(fuel_percent, item_percent)
return "size[9,8.75]"..
"label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
"list[current_player;main;0,4.5;9,3;9]"..
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
"list[current_player;main;0,7.74;9,1;]"..
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
"label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Oven"))).."]"..
"list[context;src;2.75,0.5;1,1;]"..
mcl_formspec.get_itemslot_bg(2.75,0.5,1,1)..
"list[context;fuel;2.75,2.5;1,1;]"..
mcl_formspec.get_itemslot_bg(2.75,2.5,1,1)..
"list[context;dst;5.75,1.5;1,1;]"..
mcl_formspec.get_itemslot_bg(5.75,1.5,1,1)..
"image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
(100-fuel_percent)..":default_furnace_fire_fg.png]"..
"image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:"..
(item_percent)..":gui_furnace_arrow_fg.png^[transformR270]"..
-- Craft guide button temporarily removed due to Minetest bug.
-- TODO: Add it back when the Minetest bug is fixed.
--"image_button[8,0;1,1;craftguide_book.png;craftguide;]"..
--"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]"..
"listring[context;dst]"..
"listring[current_player;main]"..
"listring[context;src]"..
"listring[current_player;main]"..
"listring[context;fuel]"..
"listring[current_player;main]"
end
local inactive_formspec = "size[9,8.75]"..
"label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]"..
"list[current_player;main;0,4.5;9,3;9]"..
mcl_formspec.get_itemslot_bg(0,4.5,9,3)..
"list[current_player;main;0,7.74;9,1;]"..
mcl_formspec.get_itemslot_bg(0,7.74,9,1)..
"label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Oven"))).."]"..
"list[context;src;2.75,0.5;1,1;]"..
mcl_formspec.get_itemslot_bg(2.75,0.5,1,1)..
"list[context;fuel;2.75,2.5;1,1;]"..
mcl_formspec.get_itemslot_bg(2.75,2.5,1,1)..
"list[context;dst;5.75,1.5;1,1;]"..
mcl_formspec.get_itemslot_bg(5.75,1.5,1,1)..
"image[2.75,1.5;1,1;default_furnace_fire_bg.png]"..
"image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]"..
-- Craft guide button temporarily removed due to Minetest bug.
-- TODO: Add it back when the Minetest bug is fixed.
--"image_button[8,0;1,1;craftguide_book.png;craftguide;]"..
--"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]"..
"listring[context;dst]"..
"listring[current_player;main]"..
"listring[context;src]"..
"listring[current_player;main]"..
"listring[context;fuel]"..
"listring[current_player;main]"
local receive_fields = function(pos, formname, fields, sender)
if fields.craftguide then
mcl_craftguide.show(sender:get_player_name())
end
end
local function give_xp(pos, player)
local meta = minetest.get_meta(pos)
local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95)
local xp = meta:get_int("xp")
if xp > 0 then
if player then
mcl_experience.add_xp(player, xp)
else
mcl_experience.throw_xp(vector.add(pos, dir), xp)
end
meta:set_int("xp", 0)
end
end
--
-- Node callback functions that are the same for active and inactive furnace
--
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
if mcl_util.check_position_protection(pos, player) then
return 0
end
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if listname == "fuel" then
-- Test stack with size 1 because we burn one fuel at a time
local teststack = ItemStack(stack)
teststack:set_count(1)
local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}})
if output.time ~= 0 then
-- Only allow to place 1 item if fuel get replaced by recipe.
-- This is the case for lava buckets.
local replace_item = decremented_input.items[1]
if replace_item:is_empty() then
-- For most fuels, just allow to place everything
return stack:get_count()
else
if inv:get_stack(listname, index):get_count() == 0 then
return 1
else
return 0
end
end
else
return 0
end
elseif listname == "src" then
return stack:get_count()
elseif listname == "dst" then
return 0
end
end
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local stack = inv:get_stack(from_list, from_index)
return allow_metadata_inventory_put(pos, to_list, to_index, stack, player)
end
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
local name = player:get_player_name()
if minetest.is_protected(pos, name) then
minetest.record_protection_violation(pos, name)
return 0
end
return stack:get_count()
end
local function on_metadata_inventory_take(pos, listname, index, stack, player)
-- Award smelting achievements
if listname == "dst" then
if stack:get_name() == "mcl_fishing:fish_cooked" then
awards.unlock(player:get_player_name(), "mcl:cookFish")
end
give_xp(pos, player)
end
end
local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
if from_list == "dst" then
give_xp(pos, player)
end
end
--[[local function spawn_flames(pos, param2)
local minrelpos, maxrelpos
local dir = minetest.facedir_to_dir(param2)
if dir.x > 0 then
minrelpos = { x = -0.6, y = -0.05, z = -0.25 }
maxrelpos = { x = -0.55, y = -0.45, z = 0.25 }
elseif dir.x < 0 then
minrelpos = { x = 0.55, y = -0.05, z = -0.25 }
maxrelpos = { x = 0.6, y = -0.45, z = 0.25 }
elseif dir.z > 0 then
minrelpos = { x = -0.25, y = -0.05, z = -0.6 }
maxrelpos = { x = 0.25, y = -0.45, z = -0.55 }
elseif dir.z < 0 then
minrelpos = { x = -0.25, y = -0.05, z = 0.55 }
maxrelpos = { x = 0.25, y = -0.45, z = 0.6 }
else
return
end
mcl_particles.add_node_particlespawner(pos, {
amount = 4,
time = 0,
minpos = vector.add(pos, minrelpos),
maxpos = vector.add(pos, maxrelpos),
minvel = { x = -0.01, y = 0, z = -0.01 },
maxvel = { x = 0.01, y = 0.1, z = 0.01 },
minexptime = 0.3,
maxexptime = 0.6,
minsize = 0.4,
maxsize = 0.8,
texture = "mcl_particles_flame.png",
glow = LIGHT_ACTIVE_FURNACE,
}, "low")
end]]
local function swap_node(pos, name)
local node = minetest.get_node(pos)
if node.name == name then
return
end
node.name = name
minetest.swap_node(pos, node)
--[[if name == "mcl_decor:oven_active" then
spawn_flames(pos, node.param2)
else
mcl_particles.delete_node_particlespawners(pos)
end]]
end
local function oven_reset_delta_time(pos)
local meta = minetest.get_meta(pos)
local time_speed = tonumber(minetest.settings:get("time_speed") or 72)
if (time_speed < 0.1) then
return
end
local time_multiplier = 86400 / time_speed
local current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier)
-- TODO: Change meta:get/set_string() to get/set_float() for "last_gametime".
-- In Windows *_float() works OK but under Linux it returns rounded unusable values like 449540.000000000
local last_game_time = meta:get_string("last_gametime")
if last_game_time then
last_game_time = tonumber(last_game_time)
end
if not last_game_time or last_game_time < 1 or math.abs(last_game_time - current_game_time) <= 1.5 then
return
end
meta:set_string("last_gametime", tostring(current_game_time))
end
local function oven_get_delta_time(pos, elapsed)
local meta = minetest.get_meta(pos)
local time_speed = tonumber(minetest.settings:get("time_speed") or 72)
local current_game_time
if (time_speed < 0.1) then
return meta, elapsed
else
local time_multiplier = 86400 / time_speed
current_game_time = .0 + ((minetest.get_day_count() + minetest.get_timeofday()) * time_multiplier)
end
local last_game_time = meta:get_string("last_gametime")
if last_game_time then
last_game_time = tonumber(last_game_time)
end
if not last_game_time or last_game_time < 1 then
last_game_time = current_game_time - 0.1
elseif last_game_time == current_game_time then
current_game_time = current_game_time + 1.0
end
local elapsed_game_time = .0 + current_game_time - last_game_time
meta:set_string("last_gametime", tostring(current_game_time))
return meta, elapsed_game_time
end
local function oven_node_timer(pos, elapsed)
--
-- Inizialize metadata
--
local meta, elapsed_game_time = oven_get_delta_time(pos, elapsed)
local fuel_time = meta:get_float("fuel_time") or 0
local src_time = meta:get_float("src_time") or 0
local src_item = meta:get_string("src_item") or ""
local fuel_totaltime = meta:get_float("fuel_totaltime") or 0
local inv = meta:get_inventory()
local srclist, fuellist
local cookable, cooked
local active = true
local fuel
srclist = inv:get_list("src")
fuellist = inv:get_list("fuel")
-- Check if src item has been changed
if srclist[1]:get_name() ~= src_item then
-- Reset cooking progress in this case
src_time = 0
src_item = srclist[1]:get_name()
end
local update = true
while elapsed_game_time > 0.00001 and update do
--
-- Cooking
--
-- Run the smoker at twice the speed of a furnace.
local el = elapsed_game_time * 2
-- Check if we have cookable content: cookable
local aftercooked
cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
cookable = minetest.get_item_group(inv:get_stack("src", 1):get_name(), "smoker_cookable") == 1
if cookable then
-- Successful cooking requires space in dst slot and time
if not inv:room_for_item("dst", cooked.item) then
cookable = false
end
end
if cookable then -- fuel lasts long enough, adjust el to cooking duration
el = math.min(el, cooked.time - src_time)
end
-- Check if we have enough fuel to burn
active = fuel_time < fuel_totaltime
if cookable and not active then
-- We need to get new fuel
local afterfuel
fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
if fuel.time == 0 then
-- No valid fuel in fuel list -- stop
fuel_totaltime = 0
src_time = 0
update = false
else
-- Take fuel from fuel list
inv:set_stack("fuel", 1, afterfuel.items[1])
fuel_time = 0
fuel_totaltime = fuel.time
el = math.min(el, fuel_totaltime)
active = true
fuellist = inv:get_list("fuel")
end
elseif active then
el = math.min(el, fuel_totaltime - fuel_time)
-- The furnace is currently active and has enough fuel
fuel_time = fuel_time + el
end
-- If there is a cookable item then check if it is ready yet
if cookable and active then
src_time = src_time + el
-- Place result in dst list if done
if src_time >= cooked.time then
inv:add_item("dst", cooked.item)
inv:set_stack("src", 1, aftercooked.items[1])
srclist = inv:get_list("src")
src_time = 0
meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count
end
end
elapsed_game_time = elapsed_game_time - el
end
if fuel and fuel_totaltime > fuel.time then
fuel_totaltime = fuel.time
end
if srclist and srclist[1]:is_empty() then
src_time = 0
end
--
-- Update formspec and node
--
local formspec = inactive_formspec
local item_percent = 0
if cookable then
item_percent = math.floor(src_time / cooked.time * 100)
end
local result = false
if active then
local fuel_percent = 0
if fuel_totaltime > 0 then
fuel_percent = math.floor(fuel_time / fuel_totaltime * 100)
end
formspec = active_formspec(fuel_percent, item_percent)
swap_node(pos, "mcl_decor:oven_active")
-- make sure timer restarts automatically
result = true
else
swap_node(pos, "mcl_decor:oven")
-- stop timer on the inactive furnace
minetest.get_node_timer(pos):stop()
end
--
-- Set meta values
--
meta:set_float("fuel_totaltime", fuel_totaltime)
meta:set_float("fuel_time", fuel_time)
meta:set_float("src_time", src_time)
if srclist then
meta:set_string("src_item", src_item)
else
meta:set_string("src_item", "")
end
meta:set_string("formspec", formspec)
return result
end
local on_rotate, after_rotate_active
if minetest.get_modpath("screwdriver") then
on_rotate = screwdriver.rotate_simple
after_rotate_active = function(pos)
local node = minetest.get_node(pos)
--mcl_particles.delete_node_particlespawners(pos)
if node.name == "mcl_decor:oven" then
return
end
--spawn_flames(pos, node.param2)
end
end
minetest.register_node("mcl_decor:oven", {
description = S("Oven"),
_tt_help = S("Cooks food faster than furnace"),
_doc_items_longdesc = S("Ovens cook several items, using a furnace fuel, into something else, but twice as fast as a normal furnace and have quadrice slots for result than smoker"),
_doc_items_usagehelp =
S([[
Use the oven to open the furnace menu.
Place a furnace fuel in the lower slot and the source material in the upper slot.
The oven will slowly use its fuel to smelt the item.
The result will be placed into one of the output slots at the right side.
]]).."\n"..
S("Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn."),
_doc_items_hidden = false,
tiles = {
"mcl_decor_oven_top.png", "mcl_nether_quartz_block_top.png",
"mcl_decor_oven_side.png", "mcl_decor_oven_side.png",
"mcl_decor_oven_side.png", "mcl_decor_oven_front.png"
},
paramtype2 = "facedir",
groups = {pickaxey=1, container=4, deco_block=1, material_stone=1},
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
on_timer = oven_node_timer,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
local meta = minetest.get_meta(pos)
local meta2 = meta:to_table()
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for _, listname in ipairs({"src", "dst", "fuel"}) do
local stack = inv:get_stack(listname, 1)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
meta:from_table(meta2)
end,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", inactive_formspec)
local inv = meta:get_inventory()
inv:set_size("src", 1)
inv:set_size("fuel", 1)
inv:set_size("dst", 1)
end,
on_destruct = function(pos)
--mcl_particles.delete_node_particlespawners(pos)
give_xp(pos)
end,
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
-- Reset accumulated game time when player works with furnace:
oven_reset_delta_time(pos)
minetest.get_node_timer(pos):start(1.0)
on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
end,
on_metadata_inventory_put = function(pos)
-- Reset accumulated game time when player works with furnace:
oven_reset_delta_time(pos)
-- start timer function, it will sort out whether furnace can burn or not.
minetest.get_node_timer(pos):start(1.0)
end,
on_metadata_inventory_take = function(pos, listname, index, stack, player)
-- Reset accumulated game time when player works with furnace:
oven_reset_delta_time(pos)
-- start timer function, it will helpful if player clears dst slot
minetest.get_node_timer(pos):start(1.0)
on_metadata_inventory_take(pos, listname, index, stack, player)
end,
allow_metadata_inventory_put = allow_metadata_inventory_put,
allow_metadata_inventory_move = allow_metadata_inventory_move,
allow_metadata_inventory_take = allow_metadata_inventory_take,
on_receive_fields = receive_fields,
_mcl_blast_resistance = 3.5,
_mcl_hardness = 3.5,
on_rotate = on_rotate,
})
minetest.register_node("mcl_decor:oven_active", {
description = S("Active Oven"),
_doc_items_create_entry = false,
tiles = {
"mcl_decor_oven_top.png", "mcl_nether_quartz_block_top.png",
"mcl_decor_oven_side.png", "mcl_decor_oven_side.png",
"mcl_decor_oven_side.png", "mcl_decor_oven_front_active.png"
},
paramtype2 = "facedir",
paramtype = "light",
light_source = LIGHT_ACTIVE_FURNACE,
drop = "mcl_decor:oven",
groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1},
is_ground_content = false,
sounds = mcl_sounds.node_sound_stone_defaults(),
on_timer = oven_node_timer,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
local meta = minetest.get_meta(pos)
local meta2 = meta
meta:from_table(oldmetadata)
local inv = meta:get_inventory()
for _, listname in ipairs({"src", "dst", "fuel"}) do
local stack = inv:get_stack(listname, 1)
if not stack:is_empty() then
local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5}
minetest.add_item(p, stack)
end
end
meta:from_table(meta2:to_table())
end,
--[[on_construct = function(pos)
local node = minetest.get_node(pos)
spawn_flames(pos, node.param2)
end,]]
on_destruct = function(pos)
--mcl_particles.delete_node_particlespawners(pos)
give_xp(pos)
end,
allow_metadata_inventory_put = allow_metadata_inventory_put,
allow_metadata_inventory_move = allow_metadata_inventory_move,
allow_metadata_inventory_take = allow_metadata_inventory_take,
on_metadata_inventory_move = on_metadata_inventory_move,
on_metadata_inventory_take = on_metadata_inventory_take,
on_receive_fields = receive_fields,
_mcl_blast_resistance = 3.5,
_mcl_hardness = 3.5,
on_rotate = on_rotate,
after_rotate = after_rotate_active,
})
minetest.register_craft({
output = "mcl_decor:oven",
recipe = {
{ "", "group:tree", "" },
{ "group:tree", "mcl_furnaces:furnace", "group:tree" },
{ "", "group:tree", "" },
}
})
-- Add entry alias for the Help
if minetest.get_modpath("doc") then
doc.add_entry_alias("nodes", "mcl_decor:oven", "nodes", "mcl_decor:oven_active")
end
--[[minetest.register_lbm({
label = "Active oven flame particles",
name = "mcl_smoker:flames",
nodenames = {"mcl_decor:oven_active"},
run_at_every_load = true,
action = function(pos, node)
spawn_flames(pos, node.param2)
end,
})
]]

BIN
textures/mcl_decor_oven_front.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

BIN
textures/mcl_decor_oven_side.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

BIN
textures/mcl_decor_oven_top.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

View File

@ -156,13 +156,16 @@ mcl_decor.register_chair_and_table("spruce", S("Spruce Chair"), S("Spruce Table"
mcl_decor.register_chair_and_table("acacia", S("Acacia Chair"), S("Acacia Table"), "mcl_core:acaciawood", "default_acacia_wood.png")
mcl_decor.register_chair_and_table("birch", S("Birch Chair"), S("Birch Table"), "mcl_core:birchwood", "mcl_core_planks_birch.png")
mcl_decor.register_chair_and_table("mangrove", S("Mangrove Chair"), S("Mangrove Table"), "mcl_mangrove:mangrove_wood", "mcl_mangrove_planks.png")
mcl_decor.register_chair_and_table("crimson", S("Crimson Chair"), S("Crimson Table"), "mcl_crimson:crimson_hyphae_wood", "crimson_hyphae_wood.png")
mcl_decor.register_chair_and_table("warped", S("Warped Chair"), S("Warped Table"), "mcl_crimson:warped_hyphae_wood", "warped_hyphae_wood.png")
mcl_decor.register_chair_and_table("crimson", S("Crimson Chair"), S("Crimson Table"), "mcl_crimson:crimson_hyphae_wood", "mcl_crimson_crimson_hyphae_wood.png")
mcl_decor.register_chair_and_table("warped", S("Warped Chair"), S("Warped Table"), "mcl_crimson:warped_hyphae_wood", "mcl_crimson_warped_hyphae_wood.png")
mcl_decor.register_chair_and_table("bamboo", S("Bamboo Chair"), S("Bamboo Table"), "mcl_bamboo:bamboo_plank", "mcl_bamboo_bamboo_block_stripped.png")
mcl_decor.register_slab_table("wooden", S("Oak Slab Table"), "mcl_core:wood", "default_wood.png")
mcl_decor.register_slab_table("dark_oak", S("Dark Oak Slab Table"), "mcl_core:darkwood", "mcl_core_planks_big_oak.png")
mcl_decor.register_slab_table("jungle", S("Jungle Slab Table"), "mcl_core:junglewood", "default_junglewood.png")
mcl_decor.register_slab_table("spruce", S("Spruce Slab Table"), "mcl_core:sprucewood", "mcl_core_planks_spruce.png")
mcl_decor.register_slab_table("acacia", S("Acacia Slab Table"), "mcl_core:acaciawood", "default_acacia_wood.png")
mcl_decor.register_slab_table("birch", S("Birch Slab Table"), "mcl_core:birchwood", "mcl_core_planks_birch.png")
mcl_decor.register_slab_table("mangrove", S("Mangrove Slab Table"), "mcl_mangrove:mangrove_wood", "mcl_mangrove_planks.png")
mcl_decor.register_slab_table("crimson", S("Crimson Slab Table"), "mcl_crimson:crimson_hyphae_wood", "crimson_hyphae_wood.png")
mcl_decor.register_slab_table("warped", S("Warped Slab Table"), "mcl_crimson:warped_hyphae_wood", "warped_hyphae_wood.png")
mcl_decor.register_slab_table("crimson", S("Crimson Slab Table"), "mcl_crimson:crimson_hyphae_wood", "mcl_crimson_crimson_hyphae_wood.png")
mcl_decor.register_slab_table("warped", S("Warped Slab Table"), "mcl_crimson:warped_hyphae_wood", "mcl_crimson_warped_hyphae_wood.png")
mcl_decor.register_slab_table("bamboo", S("Bamboo Slab Table"), "mcl_bamboo:bamboo_plank", "mcl_bamboo_bamboo_block_stripped.png")