diff options
| author | BlockMen <nmuelll@web.de> | 2014-04-06 16:33:38 +0200 | 
|---|---|---|
| committer | BlockMen <nmuelll@web.de> | 2014-04-06 16:33:38 +0200 | 
| commit | ff9a290810dbd845cdebd0f1c6fe4e978904e7b4 (patch) | |
| tree | d93d69cd17ac5b47d5006a0a0e0333af89757ed7 | |
| parent | c8c79bc275f4e38d6aec779030417aad200602ac (diff) | |
Send statbar values only to client when changed
| -rw-r--r-- | init.lua | 100 | 
1 files changed, 72 insertions, 28 deletions
| @@ -1,10 +1,17 @@  hud = {} -local health_hud = {} +-- HUD statbar values +hud.health = {}  hud.hunger = {} +hud.air = {} +hud.armor = {} +hud.hunger_out = {} +hud.armor_out = {} + +-- HUD item ids +local health_hud = {}  local hunger_hud = {}  local air_hud = {} -hud.armor = {}  local armor_hud = {}  local SAVE_INTERVAL = 0.5*60--currently useless @@ -129,7 +136,7 @@ local function costum_hud(player)  end ---needs to be set always(for 3darmor) +--needs to be defined for older version of 3darmor  function hud.set_armor()  end @@ -137,22 +144,42 @@ end  if HUD_ENABLE_HUNGER then dofile(minetest.get_modpath("hud").."/hunger.lua") end  if HUD_SHOW_ARMOR then dofile(minetest.get_modpath("hud").."/armor.lua") end - +-- update hud elemtens if value has changed  local function update_hud(player) +	local name = player:get_player_name()   --air -	local air = player:get_breath()*2 -	if player:get_breath() > 10 then air = 0 end -	player:hud_change(air_hud[player:get_player_name()], "number", air) +	local air = tonumber(hud.air[name]) +	if player:get_breath() ~= air then +		air = player:get_breath() +		hud.air[name] = air +		if air > 10 then air = 0 end +		player:hud_change(air_hud[name], "number", air*2) +	end   --health -	player:hud_change(health_hud[player:get_player_name()], "number", player:get_hp()) +	local hp = tonumber(hud.health[name]) +	if player:get_hp() ~= hp then +		hp = player:get_hp() +		hud.health[name] = hp +		player:hud_change(health_hud[name], "number", hp) +	end   --armor -	local arm = tonumber(hud.armor[player:get_player_name()]) +	local arm_out = tonumber(hud.armor_out[name]) +	if not arm_out then arm_out = 0 end +	local arm = tonumber(hud.armor[name])  	if not arm then arm = 0 end -	player:hud_change(armor_hud[player:get_player_name()], "number", arm) +	if arm_out ~= arm then +		hud.armor_out[name] = arm +		player:hud_change(armor_hud[name], "number", arm) +	end   --hunger -	local h = tonumber(hud.hunger[player:get_player_name()]) -	if h>20 then h=20 end -	player:hud_change(hunger_hud[player:get_player_name()], "number", h) +	local h_out = tonumber(hud.hunger_out[name]) +	local h = tonumber(hud.hunger[name]) +	if h_out ~= h then +		hud.hunger_out[name] = h +		-- bar should not have more than 10 icons +		if h>20 then h=20 end +		player:hud_change(hunger_hud[name], "number", h) +	end  end  local function timer(interval, player) @@ -163,11 +190,17 @@ local function timer(interval, player)  end  minetest.register_on_joinplayer(function(player) -	hud.armor[player:get_player_name()] = 0 -	if HUD_ENABLE_HUNGER then hud.hunger[player:get_player_name()] = hud.load_hunger(player) end -	if not hud.hunger[player:get_player_name()] then -		hud.hunger[player:get_player_name()] = 20 +	local name = player:get_player_name() +	hud.health[name] = player:get_hp() +	local air = player:get_breath() +	hud.air[name] = air +	if HUD_ENABLE_HUNGER then hud.hunger[name] = hud.load_hunger(player) end +	if not hud.hunger[name] then +		hud.hunger[name] = 20  	end +	hud.hunger_out[name] = hud.hunger[name] +	hud.armor[name] = 0 +	hud.armor_out[name] = 0  	minetest.after(0.5, function()  		hide_builtin(player)  		costum_hud(player) @@ -189,27 +222,38 @@ minetest.after(2.5, function()  	 timer = timer + dtime  	 timer2 = timer2 + dtime  		for _,player in ipairs(minetest.get_connected_players()) do +			local name = player:get_player_name() + +			-- only proceed if damage is enabled  			if minetest.setting_getbool("enable_damage") then -			 local h = tonumber(hud.hunger[player:get_player_name()]) +			 local h = tonumber(hud.hunger[name]) +			 local hp = player:get_hp()  			 if HUD_ENABLE_HUNGER and timer > 4 then -				if h>=16 and player:get_hp() > 0 then -					player:set_hp(player:get_hp()+1) -				elseif h<=1 and minetest.setting_getbool("enable_damage") then -					if player:get_hp()-1 >= 1 then player:set_hp(player:get_hp()-1) end +				-- heal player by 1 hp if not dead and saturation is > 15 (of 30) +				if h > 15 and hp > 0 then +					player:set_hp(hp+1) +				-- or damage player by 1 hp if saturation is < 2 (of 30) and player would not die +				elseif h <= 1 and minetest.setting_getbool("enable_damage") then +					if hp-1 >= 1 then player:set_hp(hp-1) end  				end  			 end -			 if HUD_ENABLE_HUNGER and timer2>HUD_HUNGER_TICK then -				if h>1 then -					h=h-1 -					hud.hunger[player:get_player_name()]=h +			 -- lower saturation by 1 point after xx seconds +			 if HUD_ENABLE_HUNGER and timer2 > HUD_HUNGER_TICK then +				if h > 1 then +					h = h-1 +					hud.hunger[name] = h  					hud.save_hunger(player)  				end  			 end +			 -- update current armor level  			 if HUD_SHOW_ARMOR then hud.get_armor(player) end + +			 -- update all hud elements  			 update_hud(player)  			end  		end -		if timer>4 then timer=0 end -		if timer2>HUD_HUNGER_TICK then timer2=0 end +		 +		if timer > 4 then timer = 0 end +		if timer2 > HUD_HUNGER_TICK then timer2 = 0 end  	end)  end) | 
