forked from minetest-mods/hbsprint
		
	more improvements
This commit is contained in:
		
							
								
								
									
										44
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								init.lua
									
									
									
									
									
								
							| @@ -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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user