Generalize status effects.
This commit is contained in:
parent
e5005dd8d6
commit
b486af8627
5 changed files with 76 additions and 24 deletions
40
abms.lua
40
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).
|
||||
|
|
6
chat.lua
6
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
|
||||
|
|
33
elixir.lua
33
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
|
||||
|
|
21
init.lua
21
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 = {}
|
||||
|
||||
|
|
BIN
textures/fun_caves_savage_1.png
Normal file
BIN
textures/fun_caves_savage_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3 KiB |
Loading…
Add table
Add a link
Reference in a new issue