From 6c37e89f08f962eaba788a31f5d3c798ceaa65e6 Mon Sep 17 00:00:00 2001
From: sapier <Sapier at GMX dot net>
Date: Sun, 11 May 2014 00:35:31 +0200
Subject: [PATCH] Fix old client showing duplicated health bar on new server
 Fix client not showing hearts and bubbles on connecting to old server Fix
 server not remembering hud flags correctly

---
 builtin/game/statbars.lua |  3 +++
 src/hud.cpp               | 17 +++++++++++++++++
 src/server.cpp            |  5 +++++
 3 files changed, 25 insertions(+)

diff --git a/builtin/game/statbars.lua b/builtin/game/statbars.lua
index ccc192ba4..c0d49332f 100644
--- a/builtin/game/statbars.lua
+++ b/builtin/game/statbars.lua
@@ -37,6 +37,9 @@ local function initialize_builtin_statbars(player)
 
 	if (hud_ids[name] == nil) then
 		hud_ids[name] = {}
+		-- flags are not transmitted to client on connect, we need to make sure
+		-- our current flags are transmitted by sending them actively
+		player:hud_set_flags(player:hud_get_flags())
 	end
 
 	if player:hud_get_flags().healthbar and
diff --git a/src/hud.cpp b/src/hud.cpp
index f1d7a3258..7b601ec87 100644
--- a/src/hud.cpp
+++ b/src/hud.cpp
@@ -414,6 +414,23 @@ void Hud::drawHotbar(u16 playeritem) {
 			drawItems(secondpos, hotbar_itemcount, hotbar_itemcount/2, mainlist, playeritem + 1, 0);
 		}
 	}
+
+	//////////////////////////// compatibility code to be removed //////////////
+	// this is ugly as hell but there's no other way to keep compatibility to
+	// old servers
+	if ( player->hud_flags & HUD_FLAG_HEALTHBAR_VISIBLE)
+		drawStatbar(v2s32(floor(0.5 * (float) m_screensize.X + 0.5),
+				floor(1 * (float) m_screensize.Y + 0.5)),
+				HUD_CORNER_UPPER, 0, "heart.png",
+				player->hp, v2s32((-10*24)-25,-(48+24+10)), v2s32(24,24));
+
+	if ((player->hud_flags & HUD_FLAG_BREATHBAR_VISIBLE) &&
+			(player->getBreath() < 11))
+		drawStatbar(v2s32(floor(0.5 * (float) m_screensize.X + 0.5),
+				floor(1 * (float) m_screensize.Y + 0.5)),
+				HUD_CORNER_UPPER, 0, "heart.png",
+				player->getBreath(), v2s32(25,-(48+24+10)), v2s32(24,24));
+	////////////////////////////////////////////////////////////////////////////
 }
 
 
diff --git a/src/server.cpp b/src/server.cpp
index 22efca670..d29512d87 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -3357,6 +3357,10 @@ void Server::SendHUDSetFlags(u16 peer_id, u32 flags, u32 mask)
 
 	// Write command
 	writeU16(os, TOCLIENT_HUD_SET_FLAGS);
+
+	//////////////////////////// compatibility code to be removed //////////////
+	flags &= ~(HUD_FLAG_HEALTHBAR_VISIBLE | HUD_FLAG_BREATHBAR_VISIBLE);
+	////////////////////////////////////////////////////////////////////////////
 	writeU32(os, flags);
 	writeU32(os, mask);
 
@@ -4591,6 +4595,7 @@ bool Server::hudSetFlags(Player *player, u32 flags, u32 mask) {
 		return false;
 
 	SendHUDSetFlags(player->peer_id, flags, mask);
+	player->hud_flags = flags;
 
 	m_script->player_event(player->getPlayerSAO(),"hud_changed");
 	return true;