diff --git a/abms.lua b/abms.lua index 51d88e5..f149dcd 100644 --- a/abms.lua +++ b/abms.lua @@ -158,6 +158,35 @@ minetest.register_globalstep(function(dtime) local minp = vector.subtract(pos, 0.5) local maxp = vector.add(pos, 0.5) + -- Remove status effects. + local status = fun_caves.db.status[player_name] + for name, stat in pairs(status) do + local def = fun_caves.registered_status[name] + if not def then + print('Fun Caves: Error - unregistered status ' .. name) + break + end + + local remove + if type(stat.remove) == 'number' then + if stat.remove < time then + remove = true + end + elseif def.remove then + remove = def.remove(player) + else + print('Fun Caves: Error in status remove for ' .. name) + end + + if remove then + if def and def.terminate then + fun_caves.db.status[player_name][name] = def.terminate(player) + else + fun_caves.db.status[player_name][name] = nil + end + end + end + -- ... from standing on or near hot objects. local counts = minetest_find_nodes_in_area(minp, maxp, hot_stuff) if #counts > 1 then @@ -176,17 +205,6 @@ minetest.register_globalstep(function(dtime) if #counts > 1 then player:set_hp(player:get_hp() - 1) end - - -- Check for elixirs. This doesn't have to be precise. - local armor_expire = fun_caves.db.armor_expire - if fun_caves.elixir_armor and armor_expire and armor_expire[player_name] and armor_expire[player_name].time < time then - local factor = armor_expire[player_name].factor - local armor = player:get_armor_groups() - armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy / factor))) - player:set_armor_groups(armor) - minetest.chat_send_player(player_name, minetest.colorize('#FF0000', 'Your skin feels softer...')) - armor_expire[player_name] = nil - end end -- ... from hunger (even less often). diff --git a/chat.lua b/chat.lua index 021645d..6a4b7ad 100644 --- a/chat.lua +++ b/chat.lua @@ -11,9 +11,9 @@ minetest.register_chatcommand("armor", { minetest.chat_send_player(player_name, " "..group.." "..value) end - if fun_caves.db.armor_expire and fun_caves.db.armor_expire[player_name] then - local armor_time = fun_caves.db.armor_expire[player_name].time - local min = math.floor((armor_time - minetest.get_gametime()) / 60) + if fun_caves.db.status[player_name].armor_elixir then + local armor_time = fun_caves.db.status[player_name].armor_elixir.remove + local min = math.floor(math.max(0, armor_time - minetest.get_gametime()) / 60) minetest.chat_send_player(player_name, "Your armor elixir will expire in "..min..' minutes.') end end diff --git a/elixir.lua b/elixir.lua index d566174..40cf112 100644 --- a/elixir.lua +++ b/elixir.lua @@ -1,11 +1,26 @@ local elixir_duration = 3600 +fun_caves.register_status({ + name = 'armor_elixir', + terminate = function(player) + local player_name = player:get_player_name() + local armor_elixir = fun_caves.db.status[player_name].armor_elixir + local factor = armor_elixir.factor + local armor = player:get_armor_groups() + armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy / factor))) + player:set_armor_groups(armor) + minetest.chat_send_player(player_name, minetest.colorize('#FF0000', 'Your skin feels softer...')) + fun_caves.db.status[player_name].armor_elixir = nil + end, +}) + + minetest.register_on_joinplayer(function(player) local player_name = player:get_player_name() - if fun_caves.db.armor_expire[player_name] then - local factor = fun_caves.db.armor_expire[player_name].factor + if fun_caves.db.status[player_name] and fun_caves.db.status[player_name].armor_elixir then + local factor = fun_caves.db.status[player_name].armor_elixir.factor local armor = player:get_armor_groups() armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy * factor))) player:set_armor_groups(armor) @@ -16,12 +31,12 @@ end) if fun_caves.expire_elixir_on_death then minetest.register_on_dieplayer(function(player) local player_name = player:get_player_name() - if fun_caves.db.armor_expire[player_name] then - local factor = fun_caves.db.armor_expire[player_name].factor + if fun_caves.db.status[player_name].armor_elixir then + local factor = fun_caves.db.status[player_name].armor_elixir.factor local armor = player:get_armor_groups() armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy / factor))) player:set_armor_groups(armor) - fun_caves.db.armor_expire[player_name] = nil + fun_caves.db.status[player_name].armor_elixir = nil end end) end @@ -31,16 +46,16 @@ local function armor(user, factor) local player_name = user:get_player_name() local armor = user:get_armor_groups() - if fun_caves.db.armor_expire[player_name] then - local old_factor = fun_caves.db.armor_expire[player_name].factor + if fun_caves.db.status[player_name].armor_elixir then + local old_factor = fun_caves.db.status[player_name].armor_elixir.factor armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy / factor))) end armor.fleshy = math.min(100, math.max(1, math.ceil(armor.fleshy * factor))) user:set_armor_groups(armor) minetest.chat_send_player(player_name, 'Your skin feels harder...') - fun_caves.db.armor_expire[player_name] = { - time = minetest.get_gametime() + elixir_duration, + fun_caves.db.status[player_name].armor_elixir = { + remove = minetest.get_gametime() + elixir_duration, factor = factor, } end diff --git a/init.lua b/init.lua index 0c8b1d9..f1be9e8 100644 --- a/init.lua +++ b/init.lua @@ -43,7 +43,7 @@ end if not fun_caves.db then fun_caves.db = {} end -for _, i in pairs({'teleport_data', 'hunger', 'armor_expire', 'translocators'}) do +for _, i in pairs({'teleport_data', 'hunger', 'status', 'translocators'}) do if not fun_caves.db[i] then fun_caves.db[i] = {} end @@ -102,6 +102,17 @@ function fun_caves.clone_node(name) end +fun_caves.registered_status = {} +function fun_caves.register_status(def) + fun_caves.registered_status[def.name] = { + remove = def.remove, + start = def.start, + during = def.during, + terminate = def.terminate, + } +end + + --dofile(fun_caves.path .. "/recipe_list.lua") dofile(fun_caves.path .. "/abms.lua") @@ -131,6 +142,14 @@ minetest.register_on_shutdown(function() end) +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + if not fun_caves.db.status[player_name] then + fun_caves.db.status[player_name] = {} + end +end) + + local hunger_mod = minetest.get_modpath("hunger") fun_caves.hunger_id = {} diff --git a/textures/fun_caves_savage_1.png b/textures/fun_caves_savage_1.png new file mode 100644 index 0000000..8d7fd4c Binary files /dev/null and b/textures/fun_caves_savage_1.png differ