From b486af862795e42ede45ba08805b30b050f41967 Mon Sep 17 00:00:00 2001 From: Duane Date: Thu, 30 Jun 2016 17:54:33 -0500 Subject: [PATCH] Generalize status effects. --- abms.lua | 40 +++++++++++++++++++++++--------- chat.lua | 6 ++--- elixir.lua | 33 +++++++++++++++++++------- init.lua | 21 ++++++++++++++++- textures/fun_caves_savage_1.png | Bin 0 -> 3036 bytes 5 files changed, 76 insertions(+), 24 deletions(-) create mode 100644 textures/fun_caves_savage_1.png 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 0000000000000000000000000000000000000000..8d7fd4c48e2e4acf06583f4466feabbb4d09da4e GIT binary patch literal 3036 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 e`tkV*3HUF`rf9a