Change from table indirection to getter/setter functions for dynamically updating local variables

This commit is contained in:
teknomunk 2024-11-17 07:06:03 -06:00
parent 26b16b412e
commit 49bf10b6c7
15 changed files with 160 additions and 71 deletions

View file

@ -34,17 +34,29 @@ mcl_damage = {
} }
} }
local damage_enabled = vl_tuning.setting("damage_enabled", "bool",{ local damage_enabled = true
default = minetest.settings:get_bool("enabled_damage",true) vl_tuning.setting("damage_enabled", "bool",{
default = minetest.settings:get_bool("enabled_damage",true),
set = function(val) damage_enabled = val end,
get = function() return damage_enabled end,
}) })
local fall_damage_enabled = vl_tuning.setting("gamerule:fallDamage", "bool", { local fall_damage_enabled = true
default = true vl_tuning.setting("gamerule:fallDamage", "bool", {
default = true,
set = function(val) fall_damage_enabled = val end,
get = function() return fall_damage_enabled end,
}) })
local drowning_damage_enabled = vl_tuning.setting("gamerule:drowningDamage", "bool", { local drowning_damage_enabled = true
default = true vl_tuning.setting("gamerule:drowningDamage", "bool", {
default = true,
set = function(val) drowning_damage_enabled = val end,
get = function() return drowning_damage_enabled end,
}) })
local fire_damage_enabled = vl_tuning.setting("gamerule:fireDamage", "bool", { local fire_damage_enabled
default = true vl_tuning.setting("gamerule:fireDamage", "bool", {
default = true,
set = function(val) fire_damage_enabled = val end,
get = function() return fire_damage_enabled end,
}) })
function mcl_damage.register_modifier(func, priority) function mcl_damage.register_modifier(func, priority)
@ -153,7 +165,7 @@ function mcl_damage.register_type(name, def)
end end
minetest.register_on_player_hpchange(function(player, hp_change, mt_reason) minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
if not damage_enabled[1] then return 0 end if not damage_enabled then return 0 end
if hp_change < 0 then if hp_change < 0 then
if player:get_hp() <= 0 then if player:get_hp() <= 0 then
return 0 return 0
@ -165,11 +177,11 @@ end, true)
minetest.register_on_player_hpchange(function(player, hp_change, mt_reason) minetest.register_on_player_hpchange(function(player, hp_change, mt_reason)
-- Check if damage is enabled -- Check if damage is enabled
if not damage_enabled[1] then return 0 end if not damage_enabled then return 0 end
local mcl_reason = mcl_damage.from_mt(mt_reason) local mcl_reason = mcl_damage.from_mt(mt_reason)
if not fire_damage_enabled[1] and mcl_reason.type == "fire" then return 0 end if not fire_damage_enabled and mcl_reason.type == "fire" then return 0 end
--if not drowning_damage_enabled[1] and mcl_reason.type == "drown" then return 0 end --if not drowning_damage_enabled and mcl_reason.type == "drown" then return 0 end
--if not fall_damage_enabled[1] and mcl_reason.type == "fall" then return 0 end --if not fall_damage_enabled and mcl_reason.type == "fall" then return 0 end
--minetest.log("action", "mcl_reason = "..dump(mcl_reason)..", mt_reason = "..dump(mt_reason)) --minetest.log("action", "mcl_reason = "..dump(mcl_reason)..", mt_reason = "..dump(mt_reason))

View file

@ -5,6 +5,8 @@ local storage = minetest.get_mod_storage()
local mod = {} local mod = {}
vl_tuning = mod vl_tuning = mod
local DEBUG = false
-- All registered tunable parameters -- All registered tunable parameters
local tunables = {} local tunables = {}
vl_tuning.registered_settings = tunables vl_tuning.registered_settings = tunables
@ -35,12 +37,14 @@ function tunable_class:set(value, no_hook)
local new_value = self_type.from_string(value) local new_value = self_type.from_string(value)
if new_value == nil then new_value = self.default end if new_value == nil then new_value = self.default end
self[1] = new_value self.setter(new_value)
else else
self[1] = value self.setter(value)
end end
minetest.log("action", "[vl_tuning] Set "..self.setting.." to "..dump(self[1])) if DEBUG then
minetest.log("action", "[vl_tuning] Set "..self.setting.." to "..dump(self.getter()))
end
-- Call on_change hook -- Call on_change hook
if not no_hook then if not no_hook then
@ -49,10 +53,10 @@ function tunable_class:set(value, no_hook)
end end
-- Persist value -- Persist value
storage:set_string(self.setting,self_type.to_string(self[1])) storage:set_string(self.setting,self_type.to_string(self.getter()))
end end
function tunable_class:get_string() function tunable_class:get_string()
return self.type.to_string(self[1]) return self.type.to_string(self.getter())
end end
function mod.setting(setting, setting_type, def ) function mod.setting(setting, setting_type, def )
@ -61,21 +65,29 @@ function mod.setting(setting, setting_type, def )
if tunable then return tunable end if tunable then return tunable end
assert(setting_type) assert(setting_type)
assert(def) assert(def)
assert(type(def.set) == "function", "Tunable requires set method")
assert(type(def.get) == "function", "Tunable required get method")
-- Setup the tunable data -- Setup the tunable data
tunable = table.copy(def) tunable = table.copy(def)
tunable.setting = setting tunable.setting = setting
tunable.setter = def.set
tunable.getter = def.get
tunable.type = tunable_types[setting_type] tunable.type = tunable_types[setting_type]
tunable.setting_type = setting_type tunable.setting_type = setting_type
tunable[1] = tunable.default if tunable.default then
tunable.set(tunable.default)
end
setmetatable(tunable, {__index=tunable_class}) setmetatable(tunable, {__index=tunable_class})
-- Load the setting value from mod storage -- Load the setting value from mod storage
local setting_value = storage:get_string(setting) local setting_value = storage:get_string(setting)
if setting_value and setting_value ~= "" then if setting_value and setting_value ~= "" then
tunable:set(setting_value, true) tunable:set(setting_value, true)
if DEBUG then
minetest.log("action", "[vl_tuning] Loading "..setting.." = "..dump(setting_value).." ("..dump(tunable[1])..")") minetest.log("action", "[vl_tuning] Loading "..setting.." = "..dump(setting_value).." ("..dump(tunable[1])..")")
end end
end
-- Add to the list of all available settings -- Add to the list of all available settings
tunables[setting] = tunable tunables[setting] = tunable
@ -104,7 +116,9 @@ minetest.register_chatcommand("set_setting", {
return false, S("Setting @1 doesn't exist", params[1]) return false, S("Setting @1 doesn't exist", params[1])
end end
if DEBUG then
minetest.log("action", "[vl_tuning] "..name.." set ".. params[1] .." to "..params[2]) minetest.log("action", "[vl_tuning] "..name.." set ".. params[1] .." to "..params[2])
end
tunable:set(params[2]) tunable:set(params[2])
return true return true
end end
@ -145,7 +159,9 @@ minetest.register_chatcommand("gamerule", {
local value = params[2] local value = params[2]
if value then if value then
if DEBUG then
minetest.log("action", "[vl_tuning] Setting game rule "..params[1].." to "..params[2]) minetest.log("action", "[vl_tuning] Setting game rule "..params[1].." to "..params[2])
end
tunable:set(params[2]) tunable:set(params[2])
return true return true
else else
@ -156,3 +172,9 @@ minetest.register_chatcommand("gamerule", {
dofile(modpath.."/settings.lua") dofile(modpath.."/settings.lua")
dofile(modpath.."/gui.lua") dofile(modpath.."/gui.lua")
mod.setting("debug:vl_tuning:report_value_changes", "bool", {
default = false,
set = function(val) DEBUG = val end,
get = function() return DEBUG end,
})

View file

@ -2,11 +2,17 @@ local modname = minetest.get_current_modname()
local S = minetest.get_translator(modname) local S = minetest.get_translator(modname)
local mod = vl_tuning local mod = vl_tuning
mod.keep_inventory = vl_tuning.setting("gamerule:keepInventory", "bool", { mod.keep_inventory = {}
vl_tuning.setting("gamerule:keepInventory", "bool", {
default = minetest.settings:get_bool("mcl_keepInventory", false), default = minetest.settings:get_bool("mcl_keepInventory", false),
set = function(val) mod.keep_inventory[1] = val end,
get = function() return mod.keep_inventory[1] end,
}) })
mod.respawn_blocks_explode = vl_tuning.setting("gamerule:respawnBlocksExplode", "bool", { mod.respawn_blocks_explode = {}
vl_tuning.setting("gamerule:respawnBlocksExplode", "bool", {
description = S("Prevents beds/respawn anchors from exploding in other dimensions."), description = S("Prevents beds/respawn anchors from exploding in other dimensions."),
default = true, default = true,
set = function(val) mod.respawn_blocks_explode[1] = val end,
get = function() return mod.respawn_blocks_explode[1] end,
}) })

View file

@ -4,13 +4,19 @@ local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class local mob_class = mcl_mobs.mob_class
local validate_vector = mcl_util.validate_vector local validate_vector = mcl_util.validate_vector
local gamerule_maxEntityCramming = vl_tuning.setting("gamerule:maxEntityCramming", "number", { local gamerule_maxEntityCramming = 24
vl_tuning.setting("gamerule:maxEntityCramming", "number", {
description = S("The maximum number of pushable entities a mob or player can push, before taking 6♥♥♥ entity cramming damage per half-second."), description = S("The maximum number of pushable entities a mob or player can push, before taking 6♥♥♥ entity cramming damage per half-second."),
default = 24, default = 24,
set = function(val) gamerule_maxEntityCramming = val end,
get = function() return gamerule_maxEntityCramming end,
}) })
local gamerule_doMobLoot = vl_tuning.setting("gamerule:doMobLoot", "bool", { local gamerule_doMobLoot
vl_tuning.setting("gamerule:doMobLoot", "bool", {
description = S("Whether mobs should drop items and experience orbs."), description = S("Whether mobs should drop items and experience orbs."),
default = true, default = true,
set = function(val) gamerule_doMobLoot = val end,
get = function() return gamerule_doMobLoot end,
}) })
local CRAMMING_DAMAGE = 3 local CRAMMING_DAMAGE = 3
@ -482,7 +488,7 @@ function mob_class:check_for_death(cause, cmi_cause)
-- TODO other env damage shouldn't drop xp -- TODO other env damage shouldn't drop xp
-- "rain", "water", "drowning", "suffocation" -- "rain", "water", "drowning", "suffocation"
if not gamerule_doMobLoot[1] then return end if not gamerule_doMobLoot then return end
-- dropped cooked item if mob died in fire or lava -- dropped cooked item if mob died in fire or lava
if cause == "lava" or cause == "fire" then if cause == "lava" or cause == "fire" then
@ -912,7 +918,7 @@ function mob_class:check_entity_cramming()
local l = o:get_luaentity() local l = o:get_luaentity()
if l and l.is_mob and l.health > 0 then table.insert(mobs,l) end if l and l.is_mob and l.health > 0 then table.insert(mobs,l) end
end end
local clear = #mobs < gamerule_maxEntityCramming[1] local clear = #mobs < gamerule_maxEntityCramming
local ncram = {} local ncram = {}
for _,l in pairs(mobs) do for _,l in pairs(mobs) do
if l then if l then
@ -926,7 +932,7 @@ function mob_class:check_entity_cramming()
end end
end end
for i,l in pairs(ncram) do for i,l in pairs(ncram) do
if i > gamerule_maxEntityCramming[1] then if i > gamerule_maxEntityCramming then
l.cram = true l.cram = true
else else
l.cram = nil l.cram = nil

View file

@ -3,8 +3,11 @@ local S = minetest.get_translator("mcl_mobs")
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class local mob_class = mcl_mobs.mob_class
local gamerule_doMobSpawning = vl_tuning.setting("gamerule:doMobSpawning", "bool", { local gamerule_doMobSpawning = true
description = S("Whether mobs should spawn naturally, or via global spawning logic, such as for cats, phantoms, patrols, wandering traders, or zombie sieges. Does not affect special spawning attempts, like monster spawners, raids, or iron golems."), default = true vl_tuning.setting("gamerule:doMobSpawning", "bool", {
description = S("Whether mobs should spawn naturally, or via global spawning logic, such as for cats, phantoms, patrols, wandering traders, or zombie sieges. Does not affect special spawning attempts, like monster spawners, raids, or iron golems."), default = true,
set = function(val) gamerule_doMobSpawning = val end,
get = function() return gamerule_doMobSpawning end,
}) })
local modern_lighting = minetest.settings:get_bool("mcl_mobs_modern_lighting", true) local modern_lighting = minetest.settings:get_bool("mcl_mobs_modern_lighting", true)
@ -1013,7 +1016,7 @@ if mobs_spawn then
local timer = 0 local timer = 0
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
if not gamerule_doMobSpawning[1] then return end if not gamerule_doMobSpawning then return end
timer = timer + dtime timer = timer + dtime
if timer < WAIT_FOR_SPAWN_ATTEMPT then return end if timer < WAIT_FOR_SPAWN_ATTEMPT then return end

View file

@ -2,8 +2,11 @@
mcl_raids = {} mcl_raids = {}
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
local gamerule_disableRaids = vl_tuning.setting("gamerule:disableRaids", "bool", { local gamerule_disableRaids = false
vl_tuning.setting("gamerule:disableRaids", "bool", {
description = S("Whether raids are disabled"), default = false, description = S("Whether raids are disabled"), default = false,
set = function(val) gamerule_disableRaids = val end,
get = function() return gamerule_disableRaids end,
}) })
-- Define the amount of illagers to spawn each wave. -- Define the amount of illagers to spawn each wave.
@ -295,7 +298,7 @@ mcl_events.register_event("raid",{
exclusive_to_area = 128, exclusive_to_area = 128,
enable_bossbar = true, enable_bossbar = true,
cond_start = function(self) cond_start = function(self)
if gamerule_disableRaids[1] then return false end if gamerule_disableRaids then return false end
--minetest.log("Cond start raid") --minetest.log("Cond start raid")
local r = {} local r = {}

View file

@ -8,28 +8,39 @@ local NIGHT_VISION_RATIO = 0.45
local DEBUG = false local DEBUG = false
-- Settings -- Settings
local minimum_update_interval = { 250e3 } local minimum_update_interval = 250e3
vl_tuning.setting("minimum_sky_update_interval", "number", {
default = 0.25,
set = function(val) minimum_update_interval = val * 1e6 end,
get = function() return minimum_update_interval * 1e-6 end,
})
-- Module state -- Module state
local mods_loaded = false local mods_loaded = false
-- Daylight cycle handling -- Daylight cycle handling
local fixed_time = vl_tuning.setting("fixed_daylight_time", "number", { local fixed_time = 0.5
local fixed_time_setting = vl_tuning.setting("fixed_daylight_time", "number", {
description = S("Time of day to use when gamerule:doDaylightCycle == false"), description = S("Time of day to use when gamerule:doDaylightCycle == false"),
default = 0.5 default = 0.5,
set = function(val) fixed_time = val end,
get = function() return fixed_time end,
}) })
local gamerule_doDaylightCycle = vl_tuning.setting("gamerule:doDaylightCycle", "bool",{ local gamerule_doDaylightCycle = true
vl_tuning.setting("gamerule:doDaylightCycle", "bool",{
description = S("Whether the daylight cycle and moon phases progress"), description = S("Whether the daylight cycle and moon phases progress"),
default = true, default = true,
set = function(val) gamerule_doDaylightCycle = val end,
get = function() return gamerule_doDaylightCycle end,
on_change = function(self) on_change = function(self)
if not self[1] then if not self[1] then
fixed_time:set(minetest.get_timeofday()) fixed_time_setting:set(minetest.get_timeofday())
end end
end end
}) })
local function daylightCycle() local function daylightCycle()
if not gamerule_doDaylightCycle[1] and fixed_time[1] then if not gamerule_doDaylightCycle and fixed_time then
minetest.set_timeofday(fixed_time[1]) minetest.set_timeofday(fixed_time)
end end
minetest.after(1, daylightCycle) minetest.after(1, daylightCycle)
end end
@ -170,7 +181,7 @@ function skycolor.update_player_sky_color(player)
local skycolor_data = get_skycolor_info(player) local skycolor_data = get_skycolor_info(player)
local last_update = skycolor_data.last_update or 0 local last_update = skycolor_data.last_update or 0
local now_us = minetest.get_us_time() local now_us = minetest.get_us_time()
if (now_us - last_update) < minimum_update_interval[1] then return end if (now_us - last_update) < minimum_update_interval then return end
skycolor_data.last_update = now_us skycolor_data.last_update = now_us
local sky_data = { local sky_data = {

View file

@ -7,9 +7,12 @@ mcl_weather.snow = {}
local PARTICLES_COUNT_SNOW = tonumber(minetest.settings:get("mcl_weather_snow_particles")) or 100 local PARTICLES_COUNT_SNOW = tonumber(minetest.settings:get("mcl_weather_snow_particles")) or 100
mcl_weather.snow.init_done = false mcl_weather.snow.init_done = false
local mgname = minetest.get_mapgen_setting("mg_name") local mgname = minetest.get_mapgen_setting("mg_name")
local gamerule_snowAccumulationHeight = vl_tuning.setting("gamerule:snowAccumulationHeight", "number", { local gamerule_snowAccumulationHeight = 1
vl_tuning.setting("gamerule:snowAccumulationHeight", "number", {
description = S("The maximum number of snow layers that can be accumulated on each block"), description = S("The maximum number of snow layers that can be accumulated on each block"),
default = 1, min = 0, max = 8 default = 1, min = 0, max = 8,
set = function(val) gamerule_snowAccumulationHeight = val end,
get = function() return gamerule_snowAccumulationHeight end,
}) })
local snow_biomes = { local snow_biomes = {
@ -147,7 +150,7 @@ minetest.register_abm({
if node.name:find("snow") then if node.name:find("snow") then
local l = node.name:sub(-1) local l = node.name:sub(-1)
l = tonumber(l) l = tonumber(l)
if l < gamerule_snowAccumulationHeight[1] then if l < gamerule_snowAccumulationHeight then
if node.name == "mcl_core:snow" then if node.name == "mcl_core:snow" then
nn={name = "mcl_core:snow_2"} nn={name = "mcl_core:snow_2"}
elseif l and l < 7 then elseif l and l < 7 then

View file

@ -2,8 +2,11 @@ local S = minetest.get_translator(minetest.get_current_modname())
local math = math local math = math
local gamerule_doWeatherCycle = vl_tuning.setting("gamerule:doWeatherCycle", "bool", { local gamerule_doWeatherCycle = true
description = S("Whether the weather can change naturally. The /weather command can still change weather."), default = true vl_tuning.setting("gamerule:doWeatherCycle", "bool", {
description = S("Whether the weather can change naturally. The /weather command can still change weather."), default = true,
set = function(val) gamerule_doWeatherCycle = val end,
get = function() return gamerule_doWeatherCycle end,
}) })
-- weather states, 'none' is default, other states depends from active mods -- weather states, 'none' is default, other states depends from active mods
@ -130,7 +133,7 @@ end
local t, wci = 0, mcl_weather.check_interval local t, wci = 0, mcl_weather.check_interval
minetest.register_globalstep(function(dtime) minetest.register_globalstep(function(dtime)
if not gamerule_doWeatherCycle[1] then return end if not gamerule_doWeatherCycle then return end
t = t + dtime t = t + dtime
if t < wci then return end if t < wci then return end

View file

@ -19,12 +19,18 @@ local modpath = minetest.get_modpath(modname)
local S = minetest.get_translator(modname) local S = minetest.get_translator(modname)
-- Tunable parameters -- Tunable parameters
local notif_delay = vl_tuning.setting("award_display_time", "number", { local notif_delay = 3
description = S("Amount of time award notification are displayed"), default = 3, min = 2, max = 10 vl_tuning.setting("award_display_time", "number", {
description = S("Amount of time award notification are displayed"), default = 3, min = 2, max = 10,
set = function(val) notif_delay = val end,
get = function() return notif_delay end,
}) })
local announce_in_chat = vl_tuning.setting("gamerule:announceAdvancements", "bool", { local announce_in_chat = true
vl_tuning.setting("gamerule:announceAdvancements", "bool", {
description = S("Whether advancements should be announced in chat"), description = S("Whether advancements should be announced in chat"),
default = minetest.settings:get_bool("mcl_showAdvancementMessages", true), default = minetest.settings:get_bool("mcl_showAdvancementMessages", true),
set = function(val) announce_in_chat = val end,
get = function() return announce_in_chat end,
}) })
-- The global award namespace -- The global award namespace
@ -226,7 +232,7 @@ function awards.unlock(name, award)
-- Get award -- Get award
minetest.log("action", name.." has gotten award "..award) minetest.log("action", name.." has gotten award "..award)
if announce_in_chat[1] then if announce_in_chat then
minetest.chat_send_all(S("@1 has made the advancement @2", name, minetest.colorize(mcl_colors.GREEN, "[" .. (awdef.title or award) .. "]"))) minetest.chat_send_all(S("@1 has made the advancement @2", name, minetest.colorize(mcl_colors.GREEN, "[" .. (awdef.title or award) .. "]")))
end end
data.unlocked[award] = award data.unlocked[award] = award
@ -371,7 +377,7 @@ function awards.unlock(name, award)
direction = 0, direction = 0,
z_index = 102, z_index = 102,
}) })
minetest.after(notif_delay[1], function(name) minetest.after(notif_delay, function(name)
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
if not player then if not player then
return return

View file

@ -1,9 +1,12 @@
local S = minetest.get_translator(minetest.get_current_modname()) local S = minetest.get_translator(minetest.get_current_modname())
local ASSIST_TIMEOUT_SEC = 5 local ASSIST_TIMEOUT_SEC = 5
local gamerule_showDeathMessages = vl_tuning.setting("gamerule:showDeathMessages", "bool", { local gamerule_showDeathMessages = true
vl_tuning.setting("gamerule:showDeathMessages", "bool", {
description = S("Whether death messages are put into chat when a player dies. Also affects whether a message is sent to the pet's owner when the pet dies."), description = S("Whether death messages are put into chat when a player dies. Also affects whether a message is sent to the pet's owner when the pet dies."),
default = minetest.settings:get_bool("mcl_showDeathMessages", true), default = minetest.settings:get_bool("mcl_showDeathMessages", true),
set = function(val) gamerule_showDeathMessages = val end,
get = function() return gamerule_showDeathMessages end,
}) })
mcl_death_messages = { mcl_death_messages = {
@ -208,7 +211,7 @@ local function fallback_translator(s)
end end
mcl_damage.register_on_death(function(obj, reason) mcl_damage.register_on_death(function(obj, reason)
if not gamerule_showDeathMessages[1] then return end if not gamerule_showDeathMessages then return end
local send_to local send_to

View file

@ -126,7 +126,7 @@ function ARROW_ENTITY.on_step(self, dtime)
local node = minetest.get_node(dpos) local node = minetest.get_node(dpos)
if self._stuck then if self._stuck then
self._stucktimer = self._stucktimer + dtime self._stucktimer = self._stucktimer or 0 + dtime
self._stuckrechecktimer = self._stuckrechecktimer + dtime self._stuckrechecktimer = self._stuckrechecktimer + dtime
if self._stucktimer > ARROW_TIMEOUT then if self._stucktimer > ARROW_TIMEOUT then
mcl_burning.extinguish(self.object) mcl_burning.extinguish(self.object)

View file

@ -1202,9 +1202,12 @@ end
--------------------- ---------------------
-- Vine generating -- -- Vine generating --
--------------------- ---------------------
local do_vines_spread = vl_tuning.setting("gamerule:doVinesSpread", "bool", { local do_vines_spread = true
vl_tuning.setting("gamerule:doVinesSpread", "bool", {
description = S("Whether vines can spread to other blocks. Cave vines, weeping vines, and twisting vines are not affected."), description = S("Whether vines can spread to other blocks. Cave vines, weeping vines, and twisting vines are not affected."),
default = true, default = true,
set = function(val) do_vines_spread = val end,
get = function() return do_vines_spread end,
}) })
minetest.register_abm({ minetest.register_abm({
label = "Vine growth", label = "Vine growth",
@ -1212,10 +1215,9 @@ minetest.register_abm({
interval = 47, interval = 47,
chance = 4, chance = 4,
action = function(pos, node, active_object_count, active_object_count_wider) action = function(pos, node, active_object_count, active_object_count_wider)
-- First of all, check if we are even supported, otherwise, decay. if not do_vines_spread then return end
if not do_vines_spread[1] then return end
-- First of all, check if we are even supported, otherwise, let's die! -- First of all, check if we are even supported, otherwise, decay.
if not mcl_core.check_vines_supported(pos, node) then if not mcl_core.check_vines_supported(pos, node) then
minetest.remove_node(pos) minetest.remove_node(pos)
vinedecay_particles(pos, node) vinedecay_particles(pos, node)

View file

@ -7,8 +7,11 @@ local modpath = minetest.get_modpath(modname)
local S = minetest.get_translator(modname) local S = minetest.get_translator(modname)
local has_mcl_portals = minetest.get_modpath("mcl_portals") local has_mcl_portals = minetest.get_modpath("mcl_portals")
local gamerule_doFireTick = vl_tuning.setting("gamerule:doFireTick", "bool", { local gamerule_doFireTick = true
description = S("Whether fire should spread and naturally extinguish"), default = true vl_tuning.setting("gamerule:doFireTick", "bool", {
description = S("Whether fire should spread and naturally extinguish"), default = true,
set = function(val) gamerule_doFireTick = val end,
get = function() return gamerule_doFireTick end,
}) })
local set_node = minetest.set_node local set_node = minetest.set_node
@ -369,7 +372,7 @@ else -- Fire enabled
chance = 12, chance = 12,
catch_up = false, catch_up = false,
action = function(pos) action = function(pos)
if not gamerule_doFireTick[1] then return end if not gamerule_doFireTick then return end
local p = get_ignitable(pos) local p = get_ignitable(pos)
if p then if p then
@ -388,7 +391,7 @@ else -- Fire enabled
chance = 9, chance = 9,
catch_up = false, catch_up = false,
action = function(pos) action = function(pos)
if not gamerule_doFireTick[1] then return end if not gamerule_doFireTick then return end
local p=get_ignitable_by_lava(pos) local p=get_ignitable_by_lava(pos)
if p then if p then
@ -404,7 +407,7 @@ else -- Fire enabled
chance = 3, chance = 3,
catch_up = false, catch_up = false,
action = function(pos) action = function(pos)
if not gamerule_doFireTick[1] then return end if not gamerule_doFireTick then return end
local p=has_flammable(pos) local p=has_flammable(pos)
if p then if p then
@ -427,7 +430,7 @@ else -- Fire enabled
chance = 18, chance = 18,
catch_up = false, catch_up = false,
action = function(pos) action = function(pos)
if not gamerule_doFireTick[1] then return end if not gamerule_doFireTick then return end
local p = has_flammable(pos) local p = has_flammable(pos)
if not p then if not p then

View file

@ -3,11 +3,17 @@ local modpath = minetest.get_modpath(modname)
local S = minetest.get_translator(modname) local S = minetest.get_translator(modname)
local max_tick_timer = vl_tuning.setting("health_regen_delay", "number", { local max_tick_timer
vl_tuning.setting("health_regen_delay", "number", {
default = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 0.5, default = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 0.5,
set = function(val) max_tick_timer = val end,
get = function() return max_tick_timer end,
}) })
local natural_regeneration = vl_tuning.setting("gamerule:naturalRegeneration", "bool", { local natural_regeneration = true
vl_tuning.setting("gamerule:naturalRegeneration", "bool", {
default = true, default = true,
set = function(val) natural_regeneration = val end,
get = function() return natural_regeneration end,
}) })
mcl_hunger = {} mcl_hunger = {}
@ -259,7 +265,7 @@ minetest.register_globalstep(function(dtime)
end end
if food_level >= 18 then -- slow regeneration if food_level >= 18 then -- slow regeneration
if natural_regeneration[1] and player_health > 0 and player_health < player:get_properties().hp_max then if natural_regeneration and player_health > 0 and player_health < player:get_properties().hp_max then
player:set_hp(player_health+1) player:set_hp(player_health+1)
mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN)
mcl_hunger.update_exhaustion_hud(player) mcl_hunger.update_exhaustion_hud(player)
@ -275,8 +281,8 @@ minetest.register_globalstep(function(dtime)
end end
end end
elseif food_tick_timer > max_tick_timer[1] and food_level == 20 and food_saturation_level > 0 then -- fast regeneration elseif food_tick_timer > max_tick_timer and food_level == 20 and food_saturation_level > 0 then -- fast regeneration
if natural_regeneration[1] and player_health > 0 and player_health < player:get_properties().hp_max then if natural_regeneration and player_health > 0 and player_health < player:get_properties().hp_max then
food_tick_timer = 0 food_tick_timer = 0
player:set_hp(player_health+1) player:set_hp(player_health+1)
mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN) mcl_hunger.exhaust(player_name, mcl_hunger.EXHAUST_REGEN)