From a27cdf16f40e3a3f4772b944ead8f1e4e5618359 Mon Sep 17 00:00:00 2001
From: Jeija <norrepli@gmail.com>
Date: Sat, 28 Apr 2012 02:06:25 +0200
Subject: [PATCH] Tilt camera on player damage (tweaked by PilzAdam)

---
 src/camera.cpp |  7 +++++--
 src/game.cpp   | 23 +++++++++++++++++++++++
 src/player.h   |  3 +++
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/src/camera.cpp b/src/camera.cpp
index 1b9a8c763..33e85d069 100644
--- a/src/camera.cpp
+++ b/src/camera.cpp
@@ -233,9 +233,12 @@ void Camera::update(LocalPlayer* player, f32 frametime, v2u32 screensize,
 	m_playernode->setRotation(v3f(0, -1 * player->getYaw(), 0));
 	m_playernode->updateAbsolutePosition();
 
+	//Get camera tilt timer (hurt animation)
+	float cameratilt = fabs(fabs(player->hurt_tilt_timer-0.75)-0.75);
+
 	// Set head node transformation
-	m_headnode->setPosition(player->getEyeOffset());
-	m_headnode->setRotation(v3f(player->getPitch(), 0, 0));
+	m_headnode->setPosition(player->getEyeOffset()+v3f(0,cameratilt*-player->hurt_tilt_strength,0));
+	m_headnode->setRotation(v3f(player->getPitch(), 0, cameratilt*player->hurt_tilt_strength));
 	m_headnode->updateAbsolutePosition();
 
 	// Compute relative camera position and target
diff --git a/src/game.cpp b/src/game.cpp
index 05f1da5e0..5a278a52e 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1356,6 +1356,10 @@ void the_game(
 	// NOTE: So we have to use getTime() and call run()s between them
 	u32 lasttime = device->getTimer()->getTime();
 
+	LocalPlayer* player = client.getEnv().getLocalPlayer();
+	player->hurt_tilt_timer = 0;
+	player->hurt_tilt_strength = 0;
+
 	for(;;)
 	{
 		if(device->run() == false || kill == true)
@@ -2055,8 +2059,13 @@ void the_game(
 				{
 					//u16 damage = event.player_damage.amount;
 					//infostream<<"Player damage: "<<damage<<std::endl;
+
 					damage_flash += 100.0;
 					damage_flash += 8.0 * event.player_damage.amount;
+
+					player->hurt_tilt_timer = 1.5;
+					player->hurt_tilt_strength = event.player_damage.amount/2;
+					player->hurt_tilt_strength = rangelim(player->hurt_tilt_strength, 2.0, 10.0);
 				}
 				else if(event.type == CE_PLAYER_FORCE_MOVE)
 				{
@@ -2088,6 +2097,10 @@ void the_game(
 
 					damage_flash = 0;
 
+					LocalPlayer* player = client.getEnv().getLocalPlayer();
+					player->hurt_tilt_timer = 0;
+					player->hurt_tilt_strength = 0;
+
 					/*LocalPlayer* player = client.getLocalPlayer();
 					player->setPosition(player->getPosition() + v3f(0,-BS,0));
 					camera.update(player, busytime, screensize);*/
@@ -3057,6 +3070,16 @@ void the_game(
 			damage_flash -= 100.0*dtime;
 		}
 
+		/*
+			Damage camera tilt
+		*/
+		if(player->hurt_tilt_timer > 0.0)
+		{
+			player->hurt_tilt_timer -= dtime*5;
+			if(player->hurt_tilt_timer < 0)
+				player->hurt_tilt_strength = 0;
+		}
+
 		/*
 			Draw gui
 		*/
diff --git a/src/player.h b/src/player.h
index 5a489e64f..67b02c344 100644
--- a/src/player.h
+++ b/src/player.h
@@ -209,6 +209,9 @@ class Player
 
 	u16 hp;
 
+	float hurt_tilt_timer;
+	float hurt_tilt_strength;
+
 	u16 peer_id;
 	
 	std::string inventory_formspec;
-- 
GitLab