Merge branch 'master' into biome_colored_foliage
1
API.md
@ -41,6 +41,7 @@ A lot of things are possible by using one of the APIs in the mods. Note that not
|
||||
* Beds: `ITEMS/mcl_beds`
|
||||
* Buckets: `ITEMS/mcl_buckets`
|
||||
* Dispenser support: `ITEMS/REDSTONE/mcl_dispensers`
|
||||
* Campfires: `ITEMS/mcl_campfires`
|
||||
|
||||
### Mobs
|
||||
* Mobs: `ENTITIES/mcl_mobs`
|
||||
|
@ -135,8 +135,8 @@ function mob_class:mob_activate(staticdata, def, dtime)
|
||||
end
|
||||
end
|
||||
|
||||
if not self.base_texture then
|
||||
|
||||
--If textures in definition change, reload textures
|
||||
if not self.base_texture or (def.textures and table.indexof(def.textures, self.base_texture) == -1) then
|
||||
-- compatiblity with old simple mobs textures
|
||||
if type(def.textures[1]) == "string" then
|
||||
def.textures = {def.textures}
|
||||
|
@ -47,7 +47,7 @@ local cod = {
|
||||
visual = "mesh",
|
||||
mesh = "extra_mobs_cod.b3d",
|
||||
textures = {
|
||||
{"extra_mobs_cod.png"}
|
||||
{"mobs_mc_cod.png"}
|
||||
},
|
||||
sounds = {
|
||||
},
|
||||
|
@ -25,7 +25,7 @@ local base_psdef = {
|
||||
local psdefs = {}
|
||||
for i=1,4 do
|
||||
local p = table.copy(base_psdef)
|
||||
p.texture = "extra_mobs_glow_squid_glint"..i..".png"
|
||||
p.texture = "mobs_mc_glow_squid_glint"..i..".png"
|
||||
table.insert(psdefs,p)
|
||||
end
|
||||
|
||||
@ -47,7 +47,7 @@ mcl_mobs.register_mob("mobs_mc:glow_squid", {
|
||||
visual = "mesh",
|
||||
mesh = "extra_mobs_glow_squid.b3d",
|
||||
textures = {
|
||||
{ "extra_mobs_glow_squid.png" }
|
||||
{ "mobs_mc_glow_squid.png" }
|
||||
},
|
||||
sounds = {
|
||||
damage = { name = "mobs_mc_squid_hurt", gain = 0.3 },
|
||||
|
@ -25,7 +25,7 @@ local salmon = {
|
||||
visual = "mesh",
|
||||
mesh = "extra_mobs_salmon.b3d",
|
||||
textures = {
|
||||
{"extra_mobs_salmon.png"}
|
||||
{"mobs_mc_salmon.png"}
|
||||
},
|
||||
sounds = {
|
||||
},
|
||||
|
@ -305,7 +305,7 @@ awards.register_achievement("mcl:tacticalFishing", {
|
||||
awards.register_achievement("mcl:cutestPredator", {
|
||||
title = S("The Cutest Predator"),
|
||||
description = S("Catch an Axolotl with a bucket!"),
|
||||
icon = "axolotl_bucket.png",
|
||||
icon = "mcl_achievements_axolotl_bucket.png",
|
||||
type = "Advancement",
|
||||
group = "Husbandry",
|
||||
})
|
||||
|
@ -225,8 +225,8 @@ local woods = {
|
||||
{ "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Button") },
|
||||
|
||||
{ "mangrove_wood", "mcl_mangrove:mangrove_wood", "mcl_mangrove_planks.png", S("Mangrove Button") },
|
||||
{ "crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", "crimson_hyphae_wood.png", S("Crimson Button") },
|
||||
{ "warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", "warped_hyphae_wood.png", S("Warped Button") },
|
||||
{ "crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", "mcl_crimson_hyphae_wood.png", S("Crimson Button") },
|
||||
{ "warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", "mcl_crimson_warped_hyphae_wood.png", S("Warped Button") },
|
||||
}
|
||||
|
||||
for w=1, #woods do
|
||||
|
@ -223,8 +223,8 @@ local woods = {
|
||||
{ "junglewood", "mcl_core:junglewood", "default_junglewood.png", S("Jungle Pressure Plate") },
|
||||
|
||||
{ "mangrove_wood", "mcl_mangrove:mangrove_wood", "mcl_mangrove_planks.png", S("Mangrove Pressure Plate") },
|
||||
{ "crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", "crimson_hyphae_wood.png", S("Crimson Pressure Plate") },
|
||||
{ "warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", "warped_hyphae_wood.png", S("Warped Pressure Plate") },
|
||||
{ "crimson_hyphae_wood", "mcl_crimson:crimson_hyphae_wood", "mcl_crimson_hyphae_wood.png", S("Crimson Pressure Plate") },
|
||||
{ "warped_hyphae_wood", "mcl_crimson:warped_hyphae_wood", "mcl_crimson_warped_hyphae_wood.png", S("Warped Pressure Plate") },
|
||||
}
|
||||
|
||||
for w=1, #woods do
|
||||
|
@ -51,8 +51,8 @@ minetest.register_node("mcl_armor_stand:armor_stand", {
|
||||
_doc_items_usagehelp = S("Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand."),
|
||||
drawtype = "mesh",
|
||||
mesh = "3d_armor_stand.obj",
|
||||
inventory_image = "3d_armor_stand_item.png",
|
||||
wield_image = "3d_armor_stand_item.png",
|
||||
inventory_image = "mcl_armor_stand_item.png",
|
||||
wield_image = "mcl_armor_stand_item.png",
|
||||
tiles = {"default_wood.png", "mcl_stairs_stone_slab_top.png"},
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
|
26
mods/ITEMS/mcl_campfires/API.md
Normal file
@ -0,0 +1,26 @@
|
||||
MineClone 2 Campfire API
|
||||
========================
|
||||
`mcl_campfires.register_campfire`
|
||||
---------------------------------
|
||||
Used to register campfires.
|
||||
|
||||
**Example Usage**
|
||||
```
|
||||
mcl_campfires.register_campfire("mcl_campfires:campfire", {
|
||||
description = S("Campfire"),
|
||||
inv_texture = "mcl_campfires_campfire_inv.png",
|
||||
fire_texture = "mcl_campfires_campfire_fire.png",
|
||||
lit_logs_texture = "mcl_campfires_campfire_log_lit.png",
|
||||
drops = "mcl_core:charcoal_lump 2",
|
||||
lightlevel = 14,
|
||||
damage = 1,
|
||||
})
|
||||
```
|
||||
**Values**
|
||||
* description - human readable node name.
|
||||
* inv_texture - campfire inventory texture.
|
||||
* fire_texture - texture of the campfire fire.
|
||||
* lit_logs_texture - texture for the logs of the lit campfire. if not changed, specify mcl_campfires_log.png.
|
||||
* drops - what items drop when the campfire is mined.
|
||||
* lightlevel - the level of light the campfire emits.
|
||||
* damage - amount of damage the campfire deals when the player stands on it.
|
117
mods/ITEMS/mcl_campfires/api.lua
Normal file
@ -0,0 +1,117 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
mcl_campfires = {}
|
||||
|
||||
function mcl_campfires.register_campfire(name, def)
|
||||
-- Define Campfire
|
||||
minetest.register_node(name, {
|
||||
description = def.description,
|
||||
_tt_help = S("Cooks food and keeps bees happy."),
|
||||
_doc_items_longdesc = S("Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap."),
|
||||
inventory_image = def.inv_texture,
|
||||
wield_image = def.inv_texture,
|
||||
drawtype = "mesh",
|
||||
mesh = "mcl_campfires_campfire.obj",
|
||||
tiles = {{name="mcl_campfires_log.png"},},
|
||||
use_texture_alpha = "clip",
|
||||
groups = { handy=1, axey=1, material_wood=1, not_in_creative_inventory=1, campfire=1, },
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
|
||||
if player:get_wielded_item():get_name() == "mcl_fire:flint_and_steel" then
|
||||
node.name = name.."_lit"
|
||||
minetest.set_node(pos, node)
|
||||
end
|
||||
end,
|
||||
drop = def.drops,
|
||||
_mcl_silk_touch_drop = {name},
|
||||
mcl_sounds.node_sound_wood_defaults(),
|
||||
selection_box = {
|
||||
type = 'fixed',
|
||||
fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top
|
||||
},
|
||||
collision_box = {
|
||||
type = 'fixed',
|
||||
fixed = {-.5, -.5, -.5, .5, -.05, .5},
|
||||
},
|
||||
_mcl_blast_resistance = 2,
|
||||
_mcl_hardness = 2,
|
||||
})
|
||||
|
||||
--Define Lit Campfire
|
||||
minetest.register_node(name.."_lit", {
|
||||
description = def.description,
|
||||
_tt_help = S("Cooks food and keeps bees happy."),
|
||||
_doc_items_longdesc = S("Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap."),
|
||||
inventory_image = def.inv_texture,
|
||||
wield_image = def.inv_texture,
|
||||
drawtype = "mesh",
|
||||
mesh = "mcl_campfires_campfire_lit.obj",
|
||||
tiles = {{
|
||||
name=def.fire_texture,
|
||||
animation={
|
||||
type="vertical_frames",
|
||||
aspect_w=16,
|
||||
aspect_h=16,
|
||||
length=2.0
|
||||
}},
|
||||
{name=def.lit_logs_texture,
|
||||
animation={
|
||||
type="vertical_frames",
|
||||
aspect_w=16,
|
||||
aspect_h=16,
|
||||
length=2.0
|
||||
}}
|
||||
},
|
||||
use_texture_alpha = "clip",
|
||||
groups = { handy=1, axey=1, material_wood=1, campfire=1, lit_campfire=1 },
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
|
||||
if player:get_wielded_item():get_name():find("shovel") then
|
||||
node.name = name
|
||||
minetest.set_node(pos, node)
|
||||
minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true)
|
||||
end
|
||||
end,
|
||||
drop = def.drops,
|
||||
_mcl_silk_touch_drop = {name.."_lit"},
|
||||
light_source = def.lightlevel,
|
||||
mcl_sounds.node_sound_wood_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {-.5, -.5, -.5, .5, -.05, .5},
|
||||
},
|
||||
_mcl_blast_resistance = 2,
|
||||
_mcl_hardness = 2,
|
||||
damage_per_second = def.damage,
|
||||
})
|
||||
end
|
||||
|
||||
local function burn_in_campfire(obj)
|
||||
local p = obj:get_pos()
|
||||
if p then
|
||||
local n = minetest.find_node_near(p,0.4,{"group:lit_campfire"},true)
|
||||
if n then
|
||||
mcl_burning.set_on_fire(obj, 5)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local etime = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
etime = dtime + etime
|
||||
if etime < 0.5 then return end
|
||||
etime = 0
|
||||
for _,pl in pairs(minetest.get_connected_players()) do
|
||||
burn_in_campfire(pl)
|
||||
end
|
||||
for _,ent in pairs(minetest.luaentities) do
|
||||
if ent.is_mob then
|
||||
burn_in_campfire(ent.object)
|
||||
end
|
||||
end
|
||||
end)
|
@ -1,147 +1,9 @@
|
||||
-- ||||||||||||||||||||||||||||||||
|
||||
-- ||||||||||| CAMPFIRES ||||||||||
|
||||
-- ||||||||||||||||||||||||||||||||
|
||||
|
||||
-- TO-DO:
|
||||
-- * Add Smoke Particles
|
||||
-- * Add Spark Particles
|
||||
-- * Add Cooking Meat
|
||||
-- * Add Working Sounds
|
||||
local modname = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
local campfires = {
|
||||
{ name = "Campfire", lightlevel = 14, techname = "campfire", damage = 1, drops = "mcl_core:charcoal_lump 2" },
|
||||
{ name = "Soul Campfire", lightlevel = 10, techname = "soul_campfire", damage = 2, drops = "mcl_blackstone:soul_soil" },
|
||||
}
|
||||
|
||||
for _, campfire in pairs(campfires) do
|
||||
-- Define Campfire
|
||||
minetest.register_node("mcl_campfires:" .. campfire.techname, {
|
||||
description = S(campfire.name),
|
||||
_tt_help = S("Cooks food and keeps bees happy."),
|
||||
_doc_items_longdesc = S("Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap."),
|
||||
inventory_image = "mcl_campfires_" .. campfire.techname .. "_inv.png",
|
||||
drawtype = "mesh",
|
||||
mesh = "mcl_campfires_campfire.obj",
|
||||
tiles = {{name="mcl_campfires_log.png"},},
|
||||
use_texture_alpha = "clip",
|
||||
groups = { handy=1, axey=1, material_wood=1, not_in_creative_inventory=1, campfire=1, },
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
|
||||
if player:get_wielded_item():get_name() == "mcl_fire:flint_and_steel" then
|
||||
node.name = "mcl_campfires:" .. campfire.techname .. "_lit"
|
||||
minetest.set_node(pos, node)
|
||||
end
|
||||
end,
|
||||
drop = campfire.drops,
|
||||
_mcl_silk_touch_drop = {"mcl_campfires:" .. campfire.techname},
|
||||
mcl_sounds.node_sound_wood_defaults(),
|
||||
selection_box = {
|
||||
type = 'fixed',
|
||||
fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top
|
||||
},
|
||||
collision_box = {
|
||||
type = 'fixed',
|
||||
fixed = {-.5, -.5, -.5, .5, -.05, .5},
|
||||
},
|
||||
_mcl_blast_resistance = 2,
|
||||
_mcl_hardness = 2,
|
||||
})
|
||||
|
||||
--Define Lit Campfire
|
||||
minetest.register_node("mcl_campfires:" .. campfire.techname .. "_lit", {
|
||||
description = S(campfire.name),
|
||||
_tt_help = S("Cooks food and keeps bees happy."),
|
||||
_doc_items_longdesc = S("Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap."),
|
||||
inventory_image = "mcl_campfires_" .. campfire.techname .. "_inv.png",
|
||||
drawtype = "mesh",
|
||||
mesh = "mcl_campfires_campfire_lit.obj",
|
||||
tiles = {{
|
||||
name="mcl_campfires_" .. campfire.techname .. "_fire.png",
|
||||
animation={
|
||||
type="vertical_frames",
|
||||
aspect_w=16,
|
||||
aspect_h=16,
|
||||
length=2.0
|
||||
}},
|
||||
{name="mcl_campfires_" .. campfire.techname .. "_log_lit.png",
|
||||
animation={
|
||||
type="vertical_frames",
|
||||
aspect_w=16,
|
||||
aspect_h=16,
|
||||
length=2.0
|
||||
}}
|
||||
},
|
||||
use_texture_alpha = "clip",
|
||||
groups = { handy=1, axey=1, material_wood=1, campfire=1, lit_campfire=1 },
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
on_rightclick = function (pos, node, player, itemstack, pointed_thing)
|
||||
if player:get_wielded_item():get_name():find("shovel") then
|
||||
node.name = "mcl_campfires:" .. campfire.techname
|
||||
minetest.set_node(pos, node)
|
||||
minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true)
|
||||
end
|
||||
end,
|
||||
drop = campfire.drops,
|
||||
_mcl_silk_touch_drop = {"mcl_campfires:" .. campfire.techname .. "_lit"},
|
||||
light_source = campfire.lightlevel,
|
||||
mcl_sounds.node_sound_wood_defaults(),
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
fixed = {-.5, -.5, -.5, .5, -.05, .5},
|
||||
},
|
||||
_mcl_blast_resistance = 2,
|
||||
_mcl_hardness = 2,
|
||||
damage_per_second = campfire.damage,
|
||||
})
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_campfires:campfire_lit",
|
||||
recipe = {
|
||||
{ "", "mcl_core:stick", "" },
|
||||
{ "mcl_core:stick", "group:coal", "mcl_core:stick" },
|
||||
{ "group:tree", "group:tree", "group:tree" },
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_campfires:soul_campfire_lit",
|
||||
recipe = {
|
||||
{ "", "mcl_core:stick", "" },
|
||||
{ "mcl_core:stick", "group:soul_block", "mcl_core:stick" },
|
||||
{ "group:tree", "group:tree", "group:tree" },
|
||||
}
|
||||
})
|
||||
|
||||
local function burn_in_campfire(obj)
|
||||
local p = obj:get_pos()
|
||||
if p then
|
||||
local n = minetest.find_node_near(p,0.4,{"group:lit_campfire"},true)
|
||||
if n then
|
||||
mcl_burning.set_on_fire(obj, 5)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local etime = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
etime = dtime + etime
|
||||
if etime < 0.5 then return end
|
||||
etime = 0
|
||||
for _,pl in pairs(minetest.get_connected_players()) do
|
||||
burn_in_campfire(pl)
|
||||
end
|
||||
for _,ent in pairs(minetest.luaentities) do
|
||||
if ent.is_mob then
|
||||
burn_in_campfire(ent.object)
|
||||
end
|
||||
end
|
||||
end)
|
||||
dofile(modname.."/api.lua") -- Load API File
|
||||
dofile(modname.."/register.lua") -- Load Campfire Registration File
|
||||
|
42
mods/ITEMS/mcl_campfires/register.lua
Normal file
@ -0,0 +1,42 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
|
||||
-- Register Plain Campfire
|
||||
mcl_campfires.register_campfire("mcl_campfires:campfire", {
|
||||
description = S("Campfire"),
|
||||
inv_texture = "mcl_campfires_campfire_inv.png",
|
||||
fire_texture = "mcl_campfires_campfire_fire.png",
|
||||
lit_logs_texture = "mcl_campfires_campfire_log_lit.png",
|
||||
drops = "mcl_core:charcoal_lump 2",
|
||||
lightlevel = 14,
|
||||
damage = 1,
|
||||
})
|
||||
|
||||
-- Register Soul Campfire
|
||||
mcl_campfires.register_campfire("mcl_campfires:soul_campfire", {
|
||||
description = S("Soul Campfire"),
|
||||
inv_texture = "mcl_campfires_soul_campfire_inv.png",
|
||||
fire_texture = "mcl_campfires_soul_campfire_fire.png",
|
||||
lit_logs_texture = "mcl_campfires_soul_campfire_log_lit.png",
|
||||
drops = "mcl_blackstone:soul_soil",
|
||||
lightlevel = 10,
|
||||
damage = 2,
|
||||
})
|
||||
|
||||
-- Register Campfire Crafting
|
||||
minetest.register_craft({
|
||||
output = "mcl_campfires:campfire_lit",
|
||||
recipe = {
|
||||
{ "", "mcl_core:stick", "" },
|
||||
{ "mcl_core:stick", "group:coal", "mcl_core:stick" },
|
||||
{ "group:tree", "group:tree", "group:tree" },
|
||||
}
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_campfires:soul_campfire_lit",
|
||||
recipe = {
|
||||
{ "", "mcl_core:stick", "" },
|
||||
{ "mcl_core:stick", "group:soul_block", "mcl_core:stick" },
|
||||
{ "group:tree", "group:tree", "group:tree" },
|
||||
}
|
||||
})
|
@ -1,14 +1,14 @@
|
||||
local S = minetest.get_translator(minetest.get_current_modname())
|
||||
-- Cartography Table Code. Used to create and copy maps. Needs a GUI still.
|
||||
-- Cartography Table Code. Used to create and copy maps. TODO: Needs a GUI still.
|
||||
|
||||
minetest.register_node("mcl_cartography_table:cartography_table", {
|
||||
description = S("Cartography Table"),
|
||||
_tt_help = S("Used to create or copy maps"),
|
||||
_doc_items_longdesc = S("Is used to create or copy maps for use.."),
|
||||
tiles = {
|
||||
"cartography_table_top.png", "cartography_table_side3.png",
|
||||
"cartography_table_side3.png", "cartography_table_side2.png",
|
||||
"cartography_table_side3.png", "cartography_table_side1.png"
|
||||
"mcl_cartography_table_top.png", "mcl_cartography_table_side3.png",
|
||||
"mcl_cartography_table_side3.png", "mcl_cartography_table_side2.png",
|
||||
"mcl_cartography_table_side3.png", "mcl_cartography_table_side1.png"
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
groups = { axey = 2, handy = 1, deco_block = 1, material_wood = 1, flammable = 1 },
|
||||
|
@ -70,9 +70,9 @@ minetest.register_node("mcl_crimson:warped_fungus", {
|
||||
_tt_help = S("Warped fungus is a mushroom found in the nether's warped forest."),
|
||||
_doc_items_longdesc = S("Warped fungus is a mushroom found in the nether's warped forest."),
|
||||
drawtype = "plantlike",
|
||||
tiles = { "farming_warped_fungus.png" },
|
||||
inventory_image = "farming_warped_fungus.png",
|
||||
wield_image = "farming_warped_fungus.png",
|
||||
tiles = { "mcl_crimson_warped_fungus.png" },
|
||||
inventory_image = "mcl_crimson_warped_fungus.png",
|
||||
wield_image = "mcl_crimson_warped_fungus.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
@ -98,14 +98,14 @@ minetest.register_node("mcl_crimson:warped_fungus", {
|
||||
mcl_flowerpots.register_potted_flower("mcl_crimson:warped_fungus", {
|
||||
name = "warped fungus",
|
||||
desc = S("Warped Fungus"),
|
||||
image = "farming_warped_fungus.png",
|
||||
image = "mcl_crimson_warped_fungus.png",
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_crimson:twisting_vines", {
|
||||
description = S("Twisting Vines"),
|
||||
drawtype = "plantlike",
|
||||
tiles = { "twisting_vines_plant.png" },
|
||||
inventory_image = "twisting_vines.png",
|
||||
tiles = { "mcl_crimson_twisting_vines_plant.png" },
|
||||
inventory_image = "mcl_crimson_twisting_vines.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
@ -254,8 +254,8 @@ minetest.register_node("mcl_crimson:weeping_vines", {
|
||||
minetest.register_node("mcl_crimson:nether_sprouts", {
|
||||
description = S("Nether Sprouts"),
|
||||
drawtype = "plantlike",
|
||||
tiles = { "nether_sprouts.png" },
|
||||
inventory_image = "nether_sprouts.png",
|
||||
tiles = { "mcl_crimson_nether_sprouts.png" },
|
||||
inventory_image = "mcl_crimson_nether_sprouts.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
@ -276,8 +276,8 @@ minetest.register_node("mcl_crimson:nether_sprouts", {
|
||||
minetest.register_node("mcl_crimson:warped_roots", {
|
||||
description = S("Warped Roots"),
|
||||
drawtype = "plantlike",
|
||||
tiles = { "warped_roots.png" },
|
||||
inventory_image = "warped_roots.png",
|
||||
tiles = { "mcl_crimson_warped_roots.png" },
|
||||
inventory_image = "mcl_crimson_warped_roots.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
@ -296,13 +296,13 @@ minetest.register_node("mcl_crimson:warped_roots", {
|
||||
mcl_flowerpots.register_potted_flower("mcl_crimson:warped_roots", {
|
||||
name = "warped roots",
|
||||
desc = S("Warped Roots"),
|
||||
image = "warped_roots.png",
|
||||
image = "mcl_crimson_warped_roots.png",
|
||||
})
|
||||
|
||||
|
||||
minetest.register_node("mcl_crimson:warped_wart_block", {
|
||||
description = S("Warped Wart Block"),
|
||||
tiles = {"warped_wart_block.png"},
|
||||
tiles = {"mcl_crimson_warped_stem_stripped_side.png"},
|
||||
groups = {handy = 1, hoey = 7, swordy = 1, deco_block = 1, compostability = 85},
|
||||
_mcl_hardness = 1,
|
||||
sounds = mcl_sounds.node_sound_leaves_defaults({
|
||||
@ -313,7 +313,7 @@ minetest.register_node("mcl_crimson:warped_wart_block", {
|
||||
|
||||
minetest.register_node("mcl_crimson:shroomlight", {
|
||||
description = S("Shroomlight"),
|
||||
tiles = {"shroomlight.png"},
|
||||
tiles = {"mcl_crimson_shroomlight.png"},
|
||||
groups = {handy = 1, hoey = 7, swordy = 1, deco_block = 1, compostability = 65},
|
||||
light_source = minetest.LIGHT_MAX,
|
||||
_mcl_hardness = 1,
|
||||
@ -328,10 +328,10 @@ minetest.register_node("mcl_crimson:warped_hyphae", {
|
||||
_doc_items_longdesc = S("The stem of a warped hyphae"),
|
||||
_doc_items_hidden = false,
|
||||
tiles = {
|
||||
"warped_hyphae.png",
|
||||
"warped_hyphae.png",
|
||||
"mcl_crimson_warped_hyphae.png",
|
||||
"mcl_crimson_warped_hyphae.png",
|
||||
{
|
||||
image="warped_hyphae_side.png",
|
||||
image="mcl_crimson_warped_hyphae_side.png",
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}
|
||||
},
|
||||
},
|
||||
@ -347,12 +347,12 @@ minetest.register_node("mcl_crimson:warped_hyphae", {
|
||||
minetest.register_node("mcl_crimson:warped_nylium", {
|
||||
description = S("Warped Nylium"),
|
||||
tiles = {
|
||||
"warped_nylium.png",
|
||||
"mcl_crimson_warped_nylium.png",
|
||||
"mcl_nether_netherrack.png",
|
||||
"mcl_nether_netherrack.png^warped_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^warped_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^warped_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^warped_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^mcl_crimson_warped_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^mcl_crimson_warped_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^mcl_crimson_warped_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^mcl_crimson_warped_nylium_side.png",
|
||||
},
|
||||
is_ground_content = true,
|
||||
drop = "mcl_nether:netherrack",
|
||||
@ -370,7 +370,7 @@ minetest.register_node("mcl_crimson:warped_hyphae_bark", {
|
||||
_doc_items_longdesc = S("This is a decorative block surrounded by the bark of an hyphae."),
|
||||
tiles = {
|
||||
{
|
||||
image="warped_hyphae_side.png",
|
||||
image="mcl_crimson_warped_hyphae_side.png",
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}
|
||||
},
|
||||
},
|
||||
@ -396,7 +396,7 @@ minetest.register_node("mcl_crimson:stripped_warped_hyphae", {
|
||||
description = S("Stripped Warped Hyphae"),
|
||||
_doc_items_longdesc = S("The stripped hyphae of a warped fungus"),
|
||||
_doc_items_hidden = false,
|
||||
tiles = {"warped_stem_stripped_top.png", "warped_stem_stripped_top.png", "warped_stem_stripped_side.png"},
|
||||
tiles = {"mcl_crimson_warped_stem_stripped_top.png", "mcl_crimson_warped_stem_stripped_top.png", "mcl_crimson_warped_stem_stripped_side.png"},
|
||||
paramtype2 = "facedir",
|
||||
on_place = mcl_util.rotate_axis,
|
||||
groups = {handy = 1, axey = 1, tree = 1, building_block = 1, material_wood = 1},
|
||||
@ -408,7 +408,7 @@ minetest.register_node("mcl_crimson:stripped_warped_hyphae", {
|
||||
minetest.register_node("mcl_crimson:stripped_warped_hyphae_bark", {
|
||||
description = S("Stripped Warped Hyphae Bark"),
|
||||
_doc_items_longdesc = S("The stripped hyphae bark of a warped fungus"),
|
||||
tiles = {"warped_stem_stripped_side.png"},
|
||||
tiles = {"mcl_crimson_warped_stem_stripped_side.png"},
|
||||
paramtype2 = "facedir",
|
||||
on_place = mcl_util.rotate_axis,
|
||||
groups = {handy = 1, axey = 1, bark = 1, building_block = 1, material_wood = 1},
|
||||
@ -428,7 +428,7 @@ minetest.register_craft({
|
||||
|
||||
minetest.register_node("mcl_crimson:warped_hyphae_wood", {
|
||||
description = S("Warped Hyphae Wood"),
|
||||
tiles = {"warped_hyphae_wood.png"},
|
||||
tiles = {"mcl_crimson_warped_hyphae_wood.png"},
|
||||
groups = {handy = 5,axey = 1, flammable = 3, wood=1,building_block = 1, material_wood = 1, fire_encouragement = 5, fire_flammability = 20},
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
_mcl_hardness = 2,
|
||||
@ -456,9 +456,9 @@ minetest.register_node("mcl_crimson:crimson_fungus", {
|
||||
_tt_help = S("Crimson fungus is a mushroom found in the nether's crimson forest."),
|
||||
_doc_items_longdesc = S("Crimson fungus is a mushroom found in the nether's crimson forest."),
|
||||
drawtype = "plantlike",
|
||||
tiles = { "farming_crimson_fungus.png" },
|
||||
inventory_image = "farming_crimson_fungus.png",
|
||||
wield_image = "farming_crimson_fungus.png",
|
||||
tiles = { "mcl_crimson_crimson_fungus.png" },
|
||||
inventory_image = "mcl_crimson_crimson_fungus.png",
|
||||
wield_image = "mcl_crimson_crimson_fungus.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
@ -488,14 +488,14 @@ minetest.register_node("mcl_crimson:crimson_fungus", {
|
||||
mcl_flowerpots.register_potted_flower("mcl_crimson:crimson_fungus", {
|
||||
name = "crimson fungus",
|
||||
desc = S("Crimson Fungus"),
|
||||
image = "farming_crimson_fungus.png",
|
||||
image = "mcl_crimson_crimson_fungus.png",
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_crimson:crimson_roots", {
|
||||
description = S("Crimson Roots"),
|
||||
drawtype = "plantlike",
|
||||
tiles = { "crimson_roots.png" },
|
||||
inventory_image = "crimson_roots.png",
|
||||
tiles = { "mcl_crimson_crimson_roots.png" },
|
||||
inventory_image = "mcl_crimson_crimson_roots.png",
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
walkable = false,
|
||||
@ -514,7 +514,7 @@ minetest.register_node("mcl_crimson:crimson_roots", {
|
||||
mcl_flowerpots.register_potted_flower("mcl_crimson:crimson_roots", {
|
||||
name = "crimson roots",
|
||||
desc = S("Crimson Roots"),
|
||||
image = "crimson_roots.png",
|
||||
image = "mcl_crimson_crimson_roots.png",
|
||||
})
|
||||
|
||||
minetest.register_node("mcl_crimson:crimson_hyphae", {
|
||||
@ -522,10 +522,10 @@ minetest.register_node("mcl_crimson:crimson_hyphae", {
|
||||
_doc_items_longdesc = S("The stem of a crimson hyphae"),
|
||||
_doc_items_hidden = false,
|
||||
tiles = {
|
||||
"crimson_hyphae.png",
|
||||
"crimson_hyphae.png",
|
||||
"mcl_crimson_hyphae.png",
|
||||
"mcl_crimson_hyphae.png",
|
||||
{
|
||||
image="crimson_hyphae_side.png",
|
||||
image="mcl_crimson_hyphae_side.png",
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}
|
||||
},
|
||||
},
|
||||
@ -545,7 +545,7 @@ minetest.register_node("mcl_crimson:crimson_hyphae_bark", {
|
||||
_doc_items_longdesc = S("This is a decorative block surrounded by the bark of an hyphae."),
|
||||
tiles = {
|
||||
{
|
||||
image="crimson_hyphae_side.png",
|
||||
image="mcl_crimson_hyphae_side.png",
|
||||
animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}
|
||||
},
|
||||
},
|
||||
@ -571,7 +571,7 @@ minetest.register_node("mcl_crimson:stripped_crimson_hyphae", {
|
||||
description = S("Stripped Crimson Hyphae"),
|
||||
_doc_items_longdesc = S("The stripped stem of a crimson hyphae"),
|
||||
_doc_items_hidden = false,
|
||||
tiles = {"crimson_stem_stripped_top.png", "crimson_stem_stripped_top.png", "crimson_stem_stripped_side.png"},
|
||||
tiles = {"mcl_crimson_crimson_stem_stripped_top.png", "mcl_crimson_crimson_stem_stripped_top.png", "mcl_crimson_crimson_stem_stripped_side.png"},
|
||||
paramtype2 = "facedir",
|
||||
on_place = mcl_util.rotate_axis,
|
||||
groups = {handy = 1, axey = 1, tree = 1, building_block = 1, material_wood = 1},
|
||||
@ -583,7 +583,7 @@ minetest.register_node("mcl_crimson:stripped_crimson_hyphae", {
|
||||
minetest.register_node("mcl_crimson:stripped_crimson_hyphae_bark", {
|
||||
description = S("Stripped Crimson Hyphae Bark"),
|
||||
_doc_items_longdesc = S("The stripped wood of a crimson hyphae"),
|
||||
tiles = {"crimson_stem_stripped_side.png"},
|
||||
tiles = {"mcl_crimson_crimson_stem_stripped_side.png"},
|
||||
paramtype2 = "facedir",
|
||||
on_place = mcl_util.rotate_axis,
|
||||
groups = {handy = 1, axey = 1, bark = 1, building_block = 1, material_wood = 1},
|
||||
@ -603,7 +603,7 @@ minetest.register_craft({
|
||||
|
||||
minetest.register_node("mcl_crimson:crimson_hyphae_wood", {
|
||||
description = S("Crimson Hyphae Wood"),
|
||||
tiles = {"crimson_hyphae_wood.png"},
|
||||
tiles = {"mcl_crimson_hyphae_wood.png"},
|
||||
groups = {handy = 5, axey = 1, wood = 1, building_block = 1, material_wood = 1},
|
||||
sounds = mcl_sounds.node_sound_wood_defaults(),
|
||||
_mcl_hardness = 2,
|
||||
@ -612,12 +612,12 @@ minetest.register_node("mcl_crimson:crimson_hyphae_wood", {
|
||||
minetest.register_node("mcl_crimson:crimson_nylium", {
|
||||
description = S("Crimson Nylium"),
|
||||
tiles = {
|
||||
"crimson_nylium.png",
|
||||
"mcl_crimson_nylium.png",
|
||||
"mcl_nether_netherrack.png",
|
||||
"mcl_nether_netherrack.png^crimson_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^crimson_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^crimson_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^crimson_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^mcl_crimson_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^mcl_crimson_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^mcl_crimson_nylium_side.png",
|
||||
"mcl_nether_netherrack.png^mcl_crimson_nylium_side.png",
|
||||
},
|
||||
groups = {pickaxey = 1, building_block = 1, material_stone = 1},
|
||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||
@ -676,7 +676,7 @@ mcl_doors:register_trapdoor("mcl_crimson:crimson_trapdoor", {
|
||||
_doc_items_longdesc = S("Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder."),
|
||||
_doc_items_usagehelp = S("To open or close the trapdoor, rightclick it or send a redstone signal to it."),
|
||||
tile_front = "mcl_crimson_crimson_trapdoor.png",
|
||||
tile_side = "crimson_hyphae_wood.png",
|
||||
tile_side = "mcl_crimson_hyphae_wood.png",
|
||||
wield_image = "mcl_crimson_crimson_trapdoor.png",
|
||||
groups = {handy=1,axey=1, mesecon_effector_on=1, material_wood=1, flammable=-1},
|
||||
_mcl_hardness = 3,
|
||||
@ -714,7 +714,7 @@ mcl_doors:register_trapdoor("mcl_crimson:warped_trapdoor", {
|
||||
_doc_items_longdesc = S("Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder."),
|
||||
_doc_items_usagehelp = S("To open or close the trapdoor, rightclick it or send a redstone signal to it."),
|
||||
tile_front = "mcl_crimson_warped_trapdoor.png",
|
||||
tile_side = "warped_hyphae_wood.png",
|
||||
tile_side = "mcl_crimson_warped_hyphae_wood.png",
|
||||
wield_image = "mcl_crimson_warped_trapdoor.png",
|
||||
groups = {handy=1,axey=1, mesecon_effector_on=1, material_wood=1, flammable=-1},
|
||||
_mcl_hardness = 3,
|
||||
|
@ -456,6 +456,12 @@ minetest.register_craft({
|
||||
recipe = {{"mcl_core:lapis"}},
|
||||
})
|
||||
|
||||
--[[ Uncomment when crafting blue dye back into lapis is removed.
|
||||
minetest.register_craft({
|
||||
output = "mcl_dye:blue",
|
||||
recipe = {{"mcl_flowers:cornflower"}},
|
||||
})]]
|
||||
|
||||
minetest.register_craft({
|
||||
output = "mcl_dye:lightblue",
|
||||
recipe = {{"mcl_flowers:blue_orchid"}},
|
||||
@ -526,6 +532,12 @@ minetest.register_craft({
|
||||
recipe = {{"mcl_flowers:rose_bush"}},
|
||||
})
|
||||
|
||||
--[[Uncomment when crafting white dye back into bonemeal is removed
|
||||
minetest.register_craft({
|
||||
output = "mcl_dye:white",
|
||||
recipe = {{"mcl_flowers:lily_of_the_valley"}},
|
||||
})]]
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mcl_dye:dark_green",
|
||||
@ -533,6 +545,13 @@ minetest.register_craft({
|
||||
cooktime = 10,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
type = "cooking",
|
||||
output = "mcl_dye:green",
|
||||
recipe = "group:sea_pickle",
|
||||
cooktime = 10,
|
||||
})
|
||||
|
||||
-- Dye mixing recipes.
|
||||
--
|
||||
minetest.register_craft({
|
||||
|
@ -11,6 +11,9 @@ White Tulip=
|
||||
Allium=
|
||||
Azure Bluet=
|
||||
Blue Orchid=
|
||||
Wither Rose=
|
||||
Lily of the Valley=
|
||||
Cornflower=
|
||||
Tall Grass=
|
||||
Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=
|
||||
Fern=
|
||||
|
@ -66,3 +66,15 @@ mcl_flowers.register_simple_flower("wither_rose", {
|
||||
selection_box = { -3/16, -0.5, -3/16, 3/16, 6/16, 3/16 },
|
||||
potted = true,
|
||||
})
|
||||
mcl_flowers.register_simple_flower("lily_of_the_valley", {
|
||||
desc = S("Lily of the Valley"),
|
||||
image = "mcl_flowers_lily_of_the_valley.png",
|
||||
selection_box = { -5/16, -0.5, -5/16, 4/16, 5/16, 5/16 },
|
||||
potted = true,
|
||||
})
|
||||
mcl_flowers.register_simple_flower("cornflower", {
|
||||
desc = S("Cornflower"),
|
||||
image = "mcl_flowers_cornflower.png",
|
||||
selection_box = { -4/16, -0.5, -4/16, 4/16, 3/16, 4/16 },
|
||||
potted = true,
|
||||
})
|
||||
|
@ -24,7 +24,7 @@ minetest.mkdir(map_textures_path)
|
||||
|
||||
local function load_json_file(name)
|
||||
local file = assert(io.open(modpath .. "/" .. name .. ".json", "r"))
|
||||
local data = minetest.parse_json(file:read())
|
||||
local data = minetest.parse_json(file:read("*all"))
|
||||
file:close()
|
||||
return data
|
||||
end
|
||||
|
@ -413,7 +413,7 @@ minetest.register_craftitem("mcl_mobitems:glow_ink_sac", {
|
||||
description = S("Glow Ink Sac"),
|
||||
_doc_items_longdesc = S("Use it to craft the Glow Item Frame."),
|
||||
_doc_items_usagehelp = S("Use the Glow Ink Sac and the normal Item Frame to craft the Glow Item Frame."),
|
||||
inventory_image = "extra_mobs_glow_ink_sac.png",
|
||||
inventory_image = "mcl_mobitems_glow_ink_sac.png",
|
||||
groups = { craftitem = 1 },
|
||||
})
|
||||
|
||||
|
@ -25,9 +25,7 @@ local mt_get_node = minetest.get_node
|
||||
local mt_get_node_level = minetest.get_node_level
|
||||
local mt_get_node_max_level = minetest.get_node_max_level
|
||||
local mt_get_node_or_nil = minetest.get_node_or_nil
|
||||
local mt_get_node_timer = minetest.get_node_timer
|
||||
local mt_get_meta = minetest.get_meta
|
||||
local mt_hash_node_position = minetest.hash_node_position
|
||||
local mt_set_node = minetest.set_node
|
||||
local mt_swap_node = minetest.swap_node
|
||||
local mt_pos_to_string = minetest.pos_to_string
|
||||
@ -52,18 +50,11 @@ local table = table
|
||||
local kelp = {}
|
||||
mcl_ocean.kelp = kelp
|
||||
|
||||
-- Kelp minimum and maximum age. Once reached the maximum, kelp no longer grows.
|
||||
-- Once reach the maximum, kelp no longer grows.
|
||||
kelp.MIN_AGE = 0
|
||||
kelp.MAX_AGE = 25
|
||||
|
||||
-- Tick interval (in seconds) for updating kelp.
|
||||
kelp.TICK = 0.2
|
||||
|
||||
-- Tick interval (in seconds) to store kelp meta.
|
||||
kelp.META_TICK = 2
|
||||
|
||||
-- Max age queue length
|
||||
kelp.MAX_AGE_QUEUE = 20
|
||||
kelp.TICK = 0.2 -- Tick interval (in seconds) for updating kelp.
|
||||
|
||||
-- The average amount of growth for kelp in a day is 2.16 (https://youtu.be/5Bp4lAjAk3I)
|
||||
-- Normally, a day lasts 20 minutes, meaning kelp.next_grow() is executed
|
||||
@ -81,19 +72,6 @@ kelp.ROLL_GROWTH_DENOMINATOR = 100 * 1200
|
||||
-- Sounds used to dig and place kelp.
|
||||
kelp.leaf_sounds = mcl_sounds.node_sound_leaves_defaults()
|
||||
|
||||
-- Pool storing nodetimers
|
||||
kelp.timers_pool = {}
|
||||
|
||||
-- Pool storing age, indexed by pos_hash.
|
||||
kelp.age_pool = {}
|
||||
|
||||
-- Queue(List) of hashed positions to save their ages.
|
||||
-- Invalid ones may still persist in this queue.
|
||||
kelp.age_queue = {}
|
||||
-- Stores only valid positions of each hashed postiions.
|
||||
kelp.age_queue_pos = {}
|
||||
|
||||
|
||||
-- is age in the growable range?
|
||||
function kelp.is_age_growable(age)
|
||||
return age >= 0 and age < kelp.MAX_AGE
|
||||
@ -177,7 +155,8 @@ end
|
||||
-- Roll whether to grow kelp or not.
|
||||
function kelp.roll_growth(numerator, denominator)
|
||||
-- Optional params: numerator, denominator
|
||||
return math.random(denominator or kelp.ROLL_GROWTH_DENOMINATOR) <= (numerator or kelp.ROLL_GROWTH_NUMERATOR)
|
||||
--return math.random(denominator or kelp.ROLL_GROWTH_DENOMINATOR) <= (numerator or kelp.ROLL_GROWTH_NUMERATOR)
|
||||
return true -- probability done by ABM
|
||||
end
|
||||
|
||||
|
||||
@ -230,87 +209,50 @@ function kelp.next_param2(param2)
|
||||
return math.min(param2+16 - param2 % 16, 255);
|
||||
end
|
||||
|
||||
|
||||
-- Stores age from kelp.age_queue* into their respective meta
|
||||
function kelp.store_meta()
|
||||
local count = 0
|
||||
for _ in pairs(kelp.age_queue_pos) do
|
||||
count = count + 1
|
||||
local function store_age (pos, age)
|
||||
if pos then
|
||||
--minetest.log("age: ".. tostring(age) .. ", pos: ".. mt_pos_to_string(pos))
|
||||
mt_get_meta(pos):set_int("mcl_ocean:kelp_age", age)
|
||||
end
|
||||
-- chatlog(string.format("Storing age metadata: %d in queue", #kelp.age_queue))
|
||||
-- chatlog(string.format("Storing age metadata: %d valid in queue", count))
|
||||
for i=1,#kelp.age_queue do
|
||||
local pos_hash = kelp.age_queue[i]
|
||||
local pos = kelp.age_queue_pos[pos_hash]
|
||||
-- queued hashes may no longer point to a valid pos, e.g. kelp is destroyed.
|
||||
if pos then
|
||||
mt_get_meta(pos):set_int("mcl_ocean:kelp_age", kelp.age_pool[pos_hash])
|
||||
end
|
||||
|
||||
local function retrieve_age (pos, include_nil)
|
||||
local meta = mt_get_meta(pos)
|
||||
|
||||
if include_nil then
|
||||
local age_set = meta:contains("mcl_ocean:kelp_age")
|
||||
if not age_set then
|
||||
return nil
|
||||
end
|
||||
end
|
||||
kelp.age_queue = {}
|
||||
kelp.age_queue_pos = {}
|
||||
return meta:get_int("mcl_ocean:kelp_age")
|
||||
end
|
||||
|
||||
|
||||
-- Store and queue a kelp's age to be saved into meta later.
|
||||
function kelp.store_age(age, pos, pos_hash)
|
||||
-- Watched params: pos
|
||||
-- Optional params: pos_hash
|
||||
local pos_hash = pos_hash or mt_hash_node_position(pos)
|
||||
|
||||
kelp.age_pool[pos_hash] = age
|
||||
if not kelp.age_queue_pos[pos_hash] then
|
||||
table.insert(kelp.age_queue, pos_hash)
|
||||
kelp.age_queue_pos[pos_hash] = pos
|
||||
return true, pos_hash
|
||||
end
|
||||
|
||||
return false, pos_hash
|
||||
end
|
||||
|
||||
|
||||
-- Initialise a kelp's age.
|
||||
function kelp.init_age(pos, age, pos_hash, meta)
|
||||
function kelp.init_age(pos, age, from_lbm)
|
||||
-- Watched params: pos
|
||||
-- Optional params: age, pos_hash, meta
|
||||
local pos_hash = pos_hash or mt_hash_node_position(pos)
|
||||
local meta = meta or mt_get_meta(pos)
|
||||
-- Optional params: age, from_lbm
|
||||
|
||||
local new_age
|
||||
|
||||
local stored_age = retrieve_age(pos, from_lbm)
|
||||
|
||||
local age = age
|
||||
if age then
|
||||
kelp.store_age(age, pos, pos_hash)
|
||||
elseif not meta:contains("mcl_ocean:kelp_age") then
|
||||
age = kelp.roll_init_age()
|
||||
kelp.store_age(age, pos, pos_hash)
|
||||
--minetest.log("age: " .. tostring(age))
|
||||
store_age(pos, age)
|
||||
new_age = age
|
||||
elseif not stored_age then
|
||||
new_age = kelp.roll_init_age()
|
||||
--minetest.log("no kelp age set so init with: " .. tostring(new_age))
|
||||
store_age(pos, new_age)
|
||||
else
|
||||
age = meta:get_int("mcl_ocean:kelp_age")
|
||||
if not kelp.age_pool[pos_hash] then
|
||||
kelp.age_pool[pos_hash] = age
|
||||
end
|
||||
--minetest.log("stored_age: " .. tostring(stored_age))
|
||||
new_age = stored_age
|
||||
end
|
||||
|
||||
return age, pos_hash, meta
|
||||
return new_age
|
||||
end
|
||||
|
||||
|
||||
-- Initialise kelp nodetimer.
|
||||
function kelp.init_timer(pos, pos_hash)
|
||||
-- Optional params: pos_hash
|
||||
local pos_hash = pos_hash or mt_hash_node_position(pos)
|
||||
|
||||
local timer = kelp.timers_pool[pos_hash]
|
||||
if not timer then
|
||||
timer = mt_get_node_timer(pos)
|
||||
kelp.timers_pool[pos_hash] = timer
|
||||
end
|
||||
if not timer:is_started() then
|
||||
timer:start(kelp.TICK)
|
||||
end
|
||||
|
||||
return pos_hash
|
||||
end
|
||||
|
||||
|
||||
-- Apply next kelp height. The surface is swapped. so on_construct is skipped.
|
||||
function kelp.next_height(pos, node, pos_tip, node_tip, submerged, downward_flowing)
|
||||
-- Modified params: node
|
||||
@ -342,12 +284,11 @@ end
|
||||
|
||||
|
||||
-- Grow next kelp.
|
||||
function kelp.next_grow(age, pos, node, pos_hash, pos_tip, node_tip, submerged, downward_flowing)
|
||||
function kelp.next_grow(age, pos, node, pos_tip, node_tip, submerged, downward_flowing)
|
||||
-- Watched params: pos
|
||||
-- Modified params: node
|
||||
-- Optional params: node, pos_hash, pos_tip, node_tip, submerged, downward_flowing
|
||||
-- Optional params: node, pos_tip, node_tip, submerged, downward_flowing
|
||||
local node = node or mt_get_node(pos)
|
||||
local pos_hash = pos_hash or mt_hash_node_position(pos)
|
||||
local pos_tip = pos_tip
|
||||
local node_tip = node_tip or (pos_tip and mt_get_node(pos_tip))
|
||||
if not pos_tip then
|
||||
@ -361,8 +302,8 @@ function kelp.next_grow(age, pos, node, pos_hash, pos_tip, node_tip, submerged,
|
||||
end
|
||||
|
||||
kelp.next_height(pos, node, pos_tip, node_tip, submerged, downward_flowing)
|
||||
|
||||
return kelp.store_age(age, pos, pos_hash), node, pos_hash, pos_tip, node_tip, submerged, downward_flowing
|
||||
store_age(pos, age)
|
||||
return true, node, pos_tip, node_tip, submerged, downward_flowing
|
||||
end
|
||||
|
||||
|
||||
@ -420,75 +361,68 @@ function kelp.surface_on_dig(pos, node, digger)
|
||||
kelp.detach_dig(pos, pos, true, node)
|
||||
end
|
||||
|
||||
|
||||
function kelp.surface_after_dig_node(pos, node)
|
||||
return mt_set_node(pos, {name=minetest.registered_nodes[node.name].node_dig_prediction})
|
||||
end
|
||||
|
||||
|
||||
function kelp.surface_on_timer(pos)
|
||||
local function detach_unsubmerged(pos)
|
||||
local node = mt_get_node(pos)
|
||||
local pos_hash
|
||||
|
||||
-- Update detahed kelps
|
||||
local dig_pos,_, height = kelp.find_unsubmerged(pos, node)
|
||||
if dig_pos then
|
||||
pos_hash = mt_hash_node_position(pos)
|
||||
mt_sound_play(mt_registered_nodes[node.name].sounds.dug, { gain = 0.5, pos = dig_pos }, true)
|
||||
kelp.detach_dig(dig_pos, pos, true, node, height)
|
||||
kelp.store_age(kelp.roll_init_age(), pos, pos_hash)
|
||||
local new_age = kelp.roll_init_age()
|
||||
store_age(pos, new_age)
|
||||
end
|
||||
end
|
||||
|
||||
local function grow_kelp (pos)
|
||||
local node = mt_get_node(pos)
|
||||
|
||||
-- Grow kelp on chance
|
||||
if kelp.roll_growth() then
|
||||
pos_hash = pos_hash or mt_hash_node_position(pos)
|
||||
local age = kelp.age_pool[pos_hash]
|
||||
local age = retrieve_age(pos)
|
||||
|
||||
if not age then
|
||||
--minetest.log("init a new age as not set: " .. mt_pos_to_string(pos))
|
||||
kelp.init_age(pos, nil)
|
||||
end
|
||||
|
||||
if kelp.is_age_growable(age) then
|
||||
kelp.next_grow(age+1, pos, node, pos_hash)
|
||||
--minetest.log("age growable: ".. tostring(age) .. ", pos: ".. mt_pos_to_string(pos))
|
||||
kelp.next_grow(age+1, pos, node)
|
||||
else
|
||||
--minetest.log("age not: ".. tostring(age) .. ", pos: ".. mt_pos_to_string(pos))
|
||||
end
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function kelp.surface_on_construct(pos)
|
||||
local pos_hash = mt_hash_node_position(pos)
|
||||
kelp.init_age(pos, nil, pos_hash)
|
||||
kelp.init_timer(pos, pos_hash)
|
||||
--minetest.log("on construct kelp called")
|
||||
kelp.init_age(pos, nil)
|
||||
end
|
||||
|
||||
|
||||
function kelp.surface_on_destruct(pos)
|
||||
local node = mt_get_node(pos)
|
||||
local pos_hash = mt_hash_node_position(pos)
|
||||
|
||||
-- on_falling callback. Activated by pistons for falling nodes too.
|
||||
-- I'm not sure this works. I think piston digs water and the unsubmerged nature drops kelp.
|
||||
if kelp.is_falling(pos, node) then
|
||||
kelp.detach_drop(pos, kelp.get_height(node.param2))
|
||||
end
|
||||
|
||||
-- Removes position from queue
|
||||
kelp.age_queue_pos[pos_hash] = nil
|
||||
end
|
||||
|
||||
|
||||
|
||||
function kelp.surface_on_mvps_move(pos, node, oldpos, nodemeta)
|
||||
-- Pistons moving falling nodes will have already activated on_falling callback.
|
||||
--minetest.log("kelp.surface_on_mvps_move: " .. mt_pos_to_string(pos))
|
||||
kelp.detach_dig(pos, pos, mt_get_item_group(node.name, "falling_node") ~= 1, node)
|
||||
end
|
||||
|
||||
|
||||
-- NOTE: Old ABM implementation.
|
||||
-- local function surface_unsubmerged_abm(pos, node)
|
||||
-- local dig_pos = find_unsubmerged(pos, node)
|
||||
-- if dig_pos then
|
||||
-- detach_dig(dig_pos, pos, node, true)
|
||||
-- end
|
||||
-- return true
|
||||
-- end
|
||||
|
||||
|
||||
function kelp.kelp_on_place(itemstack, placer, pointed_thing)
|
||||
if pointed_thing.type ~= "node" or not placer then
|
||||
return itemstack
|
||||
@ -576,48 +510,29 @@ function kelp.kelp_on_place(itemstack, placer, pointed_thing)
|
||||
end
|
||||
|
||||
-- Initialize age and timer when it's planted on a new surface.
|
||||
local pos_hash = mt_hash_node_position(pos_under)
|
||||
local init_age = kelp.roll_init_age()
|
||||
|
||||
if new_surface then
|
||||
kelp.init_age(pos_under, nil, pos_hash)
|
||||
kelp.init_timer(pos_under, pos_hash)
|
||||
kelp.init_age(pos_under, init_age)
|
||||
else
|
||||
kelp.store_age(kelp.roll_init_age(), pos_under, pos_hash)
|
||||
store_age(pos_under, init_age)
|
||||
end
|
||||
|
||||
return itemstack
|
||||
end
|
||||
|
||||
|
||||
function kelp.lbm_register_nodetimer(pos, node)
|
||||
local pos_hash = mt_hash_node_position(pos)
|
||||
kelp.init_age(pos, nil, pos_hash)
|
||||
kelp.init_timer(pos, pos_hash)
|
||||
function kelp.lbm_register(pos)
|
||||
kelp.init_age(pos, nil, true)
|
||||
end
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "Kelp initialise",
|
||||
name = "mcl_ocean:kelp_init",
|
||||
nodenames = { "group:kelp" },
|
||||
run_at_every_load = true, -- so old kelps are also initialised
|
||||
action = kelp.lbm_register,
|
||||
})
|
||||
|
||||
local gstep_time = 0
|
||||
function kelp.globalstep(dtime)
|
||||
if #kelp.age_queue > kelp.MAX_AGE_QUEUE then
|
||||
kelp.store_meta()
|
||||
end
|
||||
|
||||
gstep_time = gstep_time + dtime
|
||||
if gstep_time < kelp.META_TICK then
|
||||
return
|
||||
end
|
||||
gstep_time = 0
|
||||
|
||||
if #kelp.age_queue > 0 then
|
||||
kelp.store_meta()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function kelp.on_shutdown()
|
||||
if #kelp.age_queue > 0 then
|
||||
kelp.store_meta()
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- Kelp registration API
|
||||
@ -664,7 +579,6 @@ kelp.surface_deftemplate = {
|
||||
on_destruct = kelp.surface_on_destruct,
|
||||
on_dig = kelp.surface_on_dig,
|
||||
after_dig_node = kelp.surface_after_dig_node,
|
||||
on_timer = kelp.surface_on_timer,
|
||||
mesecon = { on_mvps_move = kelp.surface_on_mvps_move, },
|
||||
drop = "", -- drops are handled in on_dig
|
||||
--_mcl_falling_node_alternative = is_falling and nodename or nil,
|
||||
@ -811,35 +725,28 @@ minetest.register_craft({
|
||||
burntime = 200,
|
||||
})
|
||||
|
||||
-- Global registration ------------------------------------------------------------------------
|
||||
|
||||
minetest.register_lbm({
|
||||
label = "Kelp initialise",
|
||||
name = "mcl_ocean:kelp_init",
|
||||
minetest.register_abm({
|
||||
label = "Kelp drops",
|
||||
nodenames = { "group:kelp" },
|
||||
run_at_every_load = true, -- so old kelps are also initialised
|
||||
action = kelp.lbm_register_nodetimer,
|
||||
interval = 1.0,
|
||||
chance = 1,
|
||||
catch_up = false,
|
||||
action = detach_unsubmerged, --surface_unsubmerged_abm,
|
||||
})
|
||||
|
||||
|
||||
minetest.register_globalstep(kelp.globalstep)
|
||||
minetest.register_on_shutdown(kelp.on_shutdown)
|
||||
|
||||
-- NOTE: Old ABM implementation.
|
||||
-- minetest.register_abm({
|
||||
-- label = "Kelp drops",
|
||||
-- nodenames = { "group:kelp" },
|
||||
-- interval = 1.0,
|
||||
-- chance = 1,
|
||||
-- catch_up = false,
|
||||
-- action = surface_unsubmerged_abm,
|
||||
-- })
|
||||
--
|
||||
-- minetest.register_abm({
|
||||
-- label = "Kelp growth",
|
||||
-- nodenames = { "group:kelp" },
|
||||
-- interval = 45,
|
||||
-- chance = 12,
|
||||
-- catch_up = false,
|
||||
-- action = grow_abm,
|
||||
-- })
|
||||
-- 50% growth over a minute https://minecraft.fandom.com/wiki/Tutorials/Kelp_farming
|
||||
-- 14% chance every random tick
|
||||
-- On average, blocks are updated every 68.27 seconds (1365.33 game ticks)
|
||||
-- 1 in 7 every 68
|
||||
-- 1 in 28 every 17
|
||||
-- 1 in 21 every 22
|
||||
-- https://minecraft.fandom.com/wiki/Tick#Random_tick
|
||||
minetest.register_abm({
|
||||
label = "Kelp growth",
|
||||
nodenames = { "group:kelp" },
|
||||
interval = 17, --17
|
||||
chance = 28,
|
||||
catch_up = false,
|
||||
action = grow_kelp,
|
||||
})
|
||||
|
@ -6,10 +6,10 @@ local eat = minetest.item_eat(6, "mcl_core:bowl") --6 hunger points, player rece
|
||||
|
||||
local flower_effect = {
|
||||
[ "mcl_flowers:allium" ] = "fire_resistance",
|
||||
[ "mcl_flowers:tulip_white" ] = "poison",
|
||||
[ "mcl_flowers:lily_of_the_valley" ] = "poison",
|
||||
[ "mcl_flowers:blue_orchid" ] = "hunger",
|
||||
[ "mcl_flowers:dandelion" ] = "hunger",
|
||||
[ "mcl_flowers:peony" ] = "jump",
|
||||
[ "mcl_flowers:cornflower" ] = "jump",
|
||||
[ "mcl_flowers:oxeye_daisy" ] = "regeneration",
|
||||
[ "mcl_flowers:poppy" ] = "night_vision"
|
||||
}
|
||||
@ -108,7 +108,7 @@ minetest.register_craft({
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "mcl_sus_stew:stew",
|
||||
recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:tulip_white"},
|
||||
recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:lily_of_the_valley"},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
@ -126,7 +126,7 @@ minetest.register_craft({
|
||||
minetest.register_craft({
|
||||
type = "shapeless",
|
||||
output = "mcl_sus_stew:stew",
|
||||
recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:peony"},
|
||||
recipe = {"mcl_mushrooms:mushroom_red", "mcl_mushrooms:mushroom_brown", "mcl_core:bowl", "mcl_flowers:cornflower"},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
|
@ -5395,6 +5395,8 @@ local function register_decorations()
|
||||
register_flower("allium", nil, 0) -- flower Forest only
|
||||
register_flower("blue_orchid", {"Swampland"}, 64500, false)
|
||||
|
||||
register_flower("lily_of_the_valley", nil, 325)
|
||||
register_flower("cornflower", flower_biomes2, 486)
|
||||
end
|
||||
|
||||
-- Decorations in non-Overworld dimensions
|
||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 785 B |
Before Width: | Height: | Size: 251 B After Width: | Height: | Size: 251 B |
Before Width: | Height: | Size: 201 B After Width: | Height: | Size: 201 B |
Before Width: | Height: | Size: 297 B After Width: | Height: | Size: 297 B |
Before Width: | Height: | Size: 332 B After Width: | Height: | Size: 332 B |
Before Width: | Height: | Size: 261 B After Width: | Height: | Size: 261 B |
Before Width: | Height: | Size: 495 B After Width: | Height: | Size: 495 B |
Before Width: | Height: | Size: 304 B After Width: | Height: | Size: 304 B |
Before Width: | Height: | Size: 194 B After Width: | Height: | Size: 194 B |
Before Width: | Height: | Size: 190 B After Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 231 B After Width: | Height: | Size: 231 B |
Before Width: | Height: | Size: 214 B After Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 264 B |
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 217 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 239 B |
Before Width: | Height: | Size: 170 B After Width: | Height: | Size: 170 B |
Before Width: | Height: | Size: 239 B After Width: | Height: | Size: 239 B |
Before Width: | Height: | Size: 250 B After Width: | Height: | Size: 250 B |
Before Width: | Height: | Size: 190 B After Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 190 B After Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 222 B After Width: | Height: | Size: 222 B |
Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 196 B |
Before Width: | Height: | Size: 192 B After Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 237 B After Width: | Height: | Size: 237 B |
Before Width: | Height: | Size: 283 B After Width: | Height: | Size: 283 B |
Before Width: | Height: | Size: 309 B After Width: | Height: | Size: 309 B |
Before Width: | Height: | Size: 236 B |
Before Width: | Height: | Size: 287 B |
Before Width: | Height: | Size: 284 B |
Before Width: | Height: | Size: 532 B After Width: | Height: | Size: 532 B |
Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 210 B |
Before Width: | Height: | Size: 259 B After Width: | Height: | Size: 259 B |
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 217 B |
Before Width: | Height: | Size: 264 B After Width: | Height: | Size: 264 B |
Before Width: | Height: | Size: 223 B After Width: | Height: | Size: 223 B |
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 268 B |
Before Width: | Height: | Size: 263 B After Width: | Height: | Size: 263 B |
Before Width: | Height: | Size: 192 B After Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 228 B After Width: | Height: | Size: 228 B |
Before Width: | Height: | Size: 261 B |
Before Width: | Height: | Size: 186 B After Width: | Height: | Size: 186 B |
BIN
textures/mcl_flowers_cornflower.png
Normal file
After Width: | Height: | Size: 292 B |
BIN
textures/mcl_flowers_lily_of_the_valley.png
Normal file
After Width: | Height: | Size: 230 B |
Before Width: | Height: | Size: 222 B After Width: | Height: | Size: 222 B |
Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 298 B |
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 8.1 KiB |
Before Width: | Height: | Size: 170 B After Width: | Height: | Size: 170 B |
Before Width: | Height: | Size: 175 B After Width: | Height: | Size: 175 B |
Before Width: | Height: | Size: 175 B After Width: | Height: | Size: 175 B |
Before Width: | Height: | Size: 175 B After Width: | Height: | Size: 175 B |
Before Width: | Height: | Size: 357 B After Width: | Height: | Size: 357 B |
Before Width: | Height: | Size: 106 B After Width: | Height: | Size: 102 B |