more improvements

This commit is contained in:
sfan5 2019-10-17 17:00:35 +02:00 committed by texmex
parent 49305c18d3
commit 84a2243d12

View File

@ -40,6 +40,7 @@ end
if minetest.settings:get_bool("creative_mode") then if minetest.settings:get_bool("creative_mode") then
starve = false starve = false
end end
-- Functions -- Functions
local function start_sprint(player) local function start_sprint(player)
@ -110,22 +111,28 @@ end
local function drain_breath(player) local function drain_breath(player)
local player_breath = player:get_breath() local player_breath = player:get_breath()
if player_breath < 11 then if player_breath < player:get_properties().breath_max then
player_breath = math.max(0, player_breath - breath_drain) player_breath = math.max(0, player_breath - breath_drain)
player:set_breath(player_breath) player:set_breath(player_breath)
end end
end end
local function create_particles(player, name, pos, ground) local function is_walkable(ground)
if not ground or ground.name == "air" or ground.name == "ignore" then local ground_def = minetest.registered_nodes[ground.name]
return return ground_def and (ground_def.walkable and ground_def.liquidtype == "none")
end end
local function create_particles(player, name, ground)
local def = minetest.registered_nodes[ground.name] local def = minetest.registered_nodes[ground.name]
local tile = def.tiles[1] or def.inventory_image local tile = def.tiles[1] or def.inventory_image
if type(tile) ~= "string" then if type(tile) == "table" then
tile = tile.name
end
if not tile then
return return
end end
local pos = player:get_pos()
local rand = function() return math.random(-1,1) * math.random() / 2 end local rand = function() return math.random(-1,1) * math.random() / 2 end
for i = 1, particles do for i = 1, particles do
minetest.add_particle({ minetest.add_particle({
@ -169,6 +176,10 @@ end)
local function sprint_step(player, dtime) local function sprint_step(player, dtime)
local name = player:get_player_name() local name = player:get_player_name()
if minetest.get_player_privs(name).fast then
return
end
if stamina then if stamina then
stamina_timer[name] = (stamina_timer[name] or 0) + dtime stamina_timer[name] = (stamina_timer[name] or 0) + dtime
end end
@ -193,12 +204,17 @@ local function sprint_step(player, dtime)
return return
end end
local pos = player:get_pos() local ground_pos = player:get_pos()
local ground = minetest.get_node_or_nil({x=pos.x, y=pos.y-1, z=pos.z}) ground_pos.y = math.floor(ground_pos.y)
local walkable = false -- check if player is reasonably near a walkable node
if ground ~= nil then local ground
local ground_def = minetest.registered_nodes[ground.name] for _, y_off in ipairs({0, -1, -2}) do
walkable = ground_def and (ground_def.walkable or ground_def.liquidtype ~= "none") local testpos = vector.add(ground_pos, {x=0, y=y_off, z=0})
local testnode = minetest.get_node_or_nil(testpos)
if testnode ~= nil and is_walkable(testnode) then
ground = testnode
break
end
end end
local player_stamina = 1 local player_stamina = 1
@ -212,7 +228,7 @@ local function sprint_step(player, dtime)
hunger = hunger_ng.get_hunger_information(name).hunger.exact hunger = hunger_ng.get_hunger_information(name).hunger.exact
end end
if player_stamina > 0 and hunger > starve_limit and walkable then if player_stamina > 0 and hunger > starve_limit and ground then
start_sprint(player) start_sprint(player)
if stamina then drain_stamina(player) end if stamina then drain_stamina(player) end
if starve then drain_hunger(player, name) end if starve then drain_hunger(player, name) end
@ -221,7 +237,7 @@ local function sprint_step(player, dtime)
breath_timer[name] = 0 breath_timer[name] = 0
end end
if particles then if particles then
create_particles(player, name, pos, ground) create_particles(player, name, ground)
end end
else else
stop_sprint(player) stop_sprint(player)