Replaced inventory value storing for player attributes (#56)

master
PureTryOut 2017-04-01 14:30:27 +02:00 committed by GitHub
parent 692a73ba41
commit 2a7a7e675c
6 changed files with 54 additions and 65 deletions

View File

@ -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
-- ===================================

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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