Replaced inventory value storing for player attributes (#56)
parent
692a73ba41
commit
2a7a7e675c
|
@ -23,7 +23,7 @@ function experience.set_experience(player, value)
|
|||
value = 0
|
||||
end
|
||||
|
||||
player:get_inventory():set_stack("experience", 1, ItemStack({name = ":", count = value}))
|
||||
player:set_attribute("experience:life", value)
|
||||
end
|
||||
|
||||
function experience.update_experience(player, modifier)
|
||||
|
@ -43,7 +43,7 @@ function experience.update_experience(player, modifier)
|
|||
end
|
||||
|
||||
function experience.get_experience(player)
|
||||
return player:get_inventory():get_stack("experience", 1):get_count()
|
||||
return tonumber(player:get_attribute("experience:life"))
|
||||
end
|
||||
|
||||
-- ===================================
|
||||
|
@ -53,7 +53,7 @@ function experience.set_experience_total(player, value)
|
|||
value = 0
|
||||
end
|
||||
|
||||
player:get_inventory():set_stack("experience", 2, ItemStack({name = ":", count = value}))
|
||||
player:set_attribute("experience:total", value)
|
||||
end
|
||||
|
||||
function experience.update_experience_total(player, modifier)
|
||||
|
@ -70,7 +70,7 @@ function experience.update_experience_total(player, modifier)
|
|||
end
|
||||
|
||||
function experience.get_experience_total(player)
|
||||
return player:get_inventory():get_stack("experience", 2):get_count()
|
||||
return tonumber(player:get_attribute("experience:total"))
|
||||
end
|
||||
|
||||
-- ===================================
|
||||
|
|
|
@ -109,10 +109,7 @@ for _, value in pairs(experience_orbs) do
|
|||
end
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local inventory = player:get_inventory()
|
||||
inventory:set_size("experience", 2) -- 2 slots: 1 for current experience, 1 for total experience since last respawn
|
||||
|
||||
if not inventory:contains_item("experience", ":") then
|
||||
if not player:get_attribute("experience:life") then
|
||||
experience.set_experience(player, 0)
|
||||
experience.set_experience_total(player, 0)
|
||||
end
|
||||
|
|
|
@ -7,12 +7,10 @@ function hunger.set_hunger(player, value)
|
|||
value = 0
|
||||
end
|
||||
|
||||
local inventory = player:get_inventory()
|
||||
inventory:set_stack("hunger", 1, ItemStack({name = ":", count = value}))
|
||||
player:set_attribute("hunger:hunger", value)
|
||||
end
|
||||
|
||||
function hunger.update_hunger(player, modifier)
|
||||
local inventory = player:get_inventory()
|
||||
local player_hunger = hunger.get_hunger(player)
|
||||
|
||||
local hunger_new = 0
|
||||
|
@ -28,7 +26,7 @@ function hunger.update_hunger(player, modifier)
|
|||
end
|
||||
|
||||
function hunger.get_hunger(player)
|
||||
return player:get_inventory():get_stack("hunger", 1):get_count()
|
||||
return tonumber(player:get_attribute("hunger:hunger"))
|
||||
end
|
||||
|
||||
-- ===================================
|
||||
|
@ -41,11 +39,10 @@ function hunger.set_saturation(player, value)
|
|||
hunger.update_hunger(player, -1)
|
||||
end
|
||||
|
||||
player:get_inventory():set_stack("hunger", 2, ItemStack({name = ":", count = value * 10})) -- We can't store decimal values in an inventory, so increase it by 10 times itself, we'll decrease it when reading again
|
||||
player:set_attribute("hunger:saturation", value)
|
||||
end
|
||||
|
||||
function hunger.update_saturation(player, modifier)
|
||||
local inventory = player:get_inventory()
|
||||
local player_saturation = hunger.get_saturation(player)
|
||||
|
||||
local saturation_new = 0
|
||||
|
@ -65,7 +62,7 @@ function hunger.update_saturation(player, modifier)
|
|||
end
|
||||
|
||||
function hunger.get_saturation(player)
|
||||
return player:get_inventory():get_stack("hunger", 2):get_count() / 10
|
||||
return tonumber(player:get_attribute("hunger:saturation"))
|
||||
end
|
||||
|
||||
-- ===================================
|
||||
|
@ -78,11 +75,10 @@ function hunger.set_exhaustion(player, value)
|
|||
value = 0
|
||||
end
|
||||
|
||||
player:get_inventory():set_stack("hunger", 3, ItemStack({name = ":", count = value * 1000})) -- We can't store decimal values in an inventory, so increase it by 1000 times itself, we'll decrease it when reading again
|
||||
player:set_attribute("hunger:exhaustion", value)
|
||||
end
|
||||
|
||||
function hunger.update_exhaustion(player, modifier)
|
||||
local inventory = player:get_inventory()
|
||||
local player_exhaustion = hunger.get_exhaustion(player)
|
||||
|
||||
local exhaustion_new = 0
|
||||
|
@ -100,5 +96,5 @@ function hunger.update_exhaustion(player, modifier)
|
|||
end
|
||||
|
||||
function hunger.get_exhaustion(player)
|
||||
return player:get_inventory():get_stack("hunger", 3):get_count() / 1000
|
||||
return player:get_attribute("hunger:exhaustion")
|
||||
end
|
||||
|
|
|
@ -28,14 +28,12 @@ if minetest.setting_getbool("enable_damage") then
|
|||
if minetest.get_modpath("status") ~= nil then
|
||||
dofile(minetest.get_modpath("hunger") .. "/status.lua")
|
||||
end
|
||||
|
||||
|
||||
position = {}
|
||||
local players = {}
|
||||
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local inventory = player:get_inventory()
|
||||
inventory:set_size("hunger", 3) -- 3 slots: 1 for hunger, 1 for saturation, 1 for exhaustion
|
||||
if not inventory:contains_item("hunger", ":") then
|
||||
if not player:get_attribute("hunger:hunger") then
|
||||
hunger.set_hunger(player, HUNGER_MAX)
|
||||
hunger.set_saturation(player, HUNGER_SATURATION_MAX)
|
||||
hunger.set_exhaustion(player, HUNGER_EXHAUSTION_MAX)
|
||||
|
|
|
@ -18,27 +18,36 @@ end
|
|||
|
||||
|
||||
function status.init_status_by_id(status_id, player, level, duration)
|
||||
player:get_inventory():set_stack("status", status_id, ItemStack({name = ":", count = level, wear = duration, metadata = "0"}))
|
||||
player:set_attribute("status:" .. status_id, minetest.write_json({
|
||||
level = level,
|
||||
duration = duration,
|
||||
ticks = 0
|
||||
}))
|
||||
end
|
||||
|
||||
function status.init_status_by_name(status_name, player, level, duration)
|
||||
local id = nil
|
||||
local status_id = nil
|
||||
|
||||
for key, value in pairs(statuses) do
|
||||
if value.name == status_name then
|
||||
id = key
|
||||
status_id = key
|
||||
end
|
||||
end
|
||||
|
||||
if id then
|
||||
player:get_inventory():set_stack("status", id, ItemStack({name = ":", count = level, wear = duration, metadata = "0"}))
|
||||
if status_id then
|
||||
player:set_attribute("status:" .. status_id, minetest.write_json({
|
||||
level = level,
|
||||
duration = duration,
|
||||
ticks = 0
|
||||
}))
|
||||
else
|
||||
minetest.log("FAILURE: No such status effect known")
|
||||
end
|
||||
end
|
||||
|
||||
function status.player_has_status_by_id(status_id, player)
|
||||
if player:get_inventory():get_stack("status", status_id):get_count() ~= 0 then
|
||||
local player_status = player:get_attribute("status:" .. status_id)
|
||||
if player_status and minetest.parse_json(player_status).level ~= 0 then
|
||||
return true
|
||||
end
|
||||
|
||||
|
@ -46,43 +55,38 @@ function status.player_has_status_by_id(status_id, player)
|
|||
end
|
||||
|
||||
function status.player_has_status_by_name(status_name, player)
|
||||
local id = nil
|
||||
local status_id = nil
|
||||
|
||||
for key, value in pairs(statuses) do
|
||||
if value.name == status_name then
|
||||
id = key
|
||||
status_id = key
|
||||
end
|
||||
end
|
||||
|
||||
if player:get_inventory():get_stack("status", id):get_count() ~= 0 then
|
||||
return true
|
||||
if status_id then
|
||||
local player_status = player:get_attribute("status:" .. status_id)
|
||||
if player_status and minetest.parse_json(player_status).level ~= 0 then
|
||||
return true
|
||||
end
|
||||
else
|
||||
minetest.log("FAILURE: No such status effect known")
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function status.get_player_status_length_by_id(status_id, player)
|
||||
local stack = player:get_inventory():get_stack("status", status_id)
|
||||
if stack:get_count() ~= 0 then
|
||||
return stack:get_wear()
|
||||
end
|
||||
|
||||
return false
|
||||
return minetest.parse_json(player:get_attribute("status:" .. status_id)).duration
|
||||
end
|
||||
|
||||
function status.get_player_status_length_by_name(status_name, player)
|
||||
local id = nil
|
||||
local status_id = nil
|
||||
|
||||
for key, value in pairs(statuses) do
|
||||
if value.name == status_name then
|
||||
id = key
|
||||
status_id = key
|
||||
end
|
||||
end
|
||||
|
||||
local stack = player:get_inventory():get_stack("status", id)
|
||||
if stack:get_count() ~= 0 then
|
||||
return stack:get_wear()
|
||||
end
|
||||
|
||||
return false
|
||||
return minetest.parse_json(player:get_attribute("status:" .. status_id)).duration
|
||||
end
|
||||
|
|
|
@ -5,41 +5,35 @@ dofile(minetest.get_modpath("status") .. "/functions.lua")
|
|||
dofile(minetest.get_modpath("status") .. "/builtin.lua")
|
||||
|
||||
if minetest.setting_getbool("enable_damage") then
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local inventory = player:get_inventory()
|
||||
inventory:set_size("status", #statuses)
|
||||
end)
|
||||
|
||||
local timer = 0
|
||||
minetest.register_globalstep(function(dtime)
|
||||
timer = timer + dtime
|
||||
for _, player in pairs(minetest.get_connected_players()) do
|
||||
local inventory = player:get_inventory()
|
||||
|
||||
for id, status_def in pairs(statuses) do
|
||||
if inventory:get_stack("status", id):get_count() ~= 0 then -- Check if the user has this status (status level 1 or higher)
|
||||
local stack = inventory:get_stack("status", id)
|
||||
if status.player_has_status_by_id(id, player) then -- Check if the user has this status (status level 1 or higher)
|
||||
local attribute = minetest.parse_json(player:get_attribute("status:" .. id))
|
||||
|
||||
if timer >= 1 then -- Each second
|
||||
timer = 0
|
||||
|
||||
stack:set_wear(stack:get_wear() - 1) --We use wear as the countdown timer
|
||||
inventory:set_stack("status", id, stack)
|
||||
attribute.duration = attribute.duration - 1
|
||||
|
||||
player:set_attribute("status:" .. id, minetest.write_json(attribute))
|
||||
end
|
||||
|
||||
if stack:get_wear() > 0 then
|
||||
stack:set_metadata(tostring(tonumber(stack:get_metadata()) + 1)) --We use metadata to count the ticks
|
||||
inventory:set_stack("status", id, stack)
|
||||
if status.get_player_status_length_by_id(id, player) > 0 then
|
||||
attribute.ticks = attribute.ticks + 1
|
||||
player:set_attribute("status:" .. id, minetest.write_json(attribute))
|
||||
|
||||
local result = status_def.callback(player, stack:get_count(), stack:get_wear(), tonumber(stack:get_metadata())) -- Player object, status level, duration left, ticks since last callback
|
||||
local result = status_def.callback(player, attribute.level, attribute.duration, attribute.ticks) -- Player object, status level, duration left, ticks since last callback
|
||||
|
||||
if result then -- If the callback ran succesfull and wants to reset the tick timer
|
||||
stack:set_metadata("0")
|
||||
inventory:set_stack("status", id, stack)
|
||||
attribute.ticks = 0
|
||||
player:set_attribute("status:" .. id, minetest.write_json(attribute))
|
||||
end
|
||||
else
|
||||
stack:set_count(0)
|
||||
inventory:set_stack("status", id, stack)
|
||||
attribute.level = 0
|
||||
player:set_attribute("status:" .. id, minetest.write_json(attribute))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue