From 1e0e85f82e030e761c36ba5a12427bec0fb4e4f2 Mon Sep 17 00:00:00 2001
From: RealBadAngel <maciej.kasatkin@o2.pl>
Date: Thu, 23 Jul 2015 04:35:13 +0200
Subject: [PATCH] Fix issues with light of attached CAOs

---
 src/clientobject.h  |  1 +
 src/content_cao.cpp | 30 ++++++++++++++++++++++++------
 src/content_cao.h   |  2 ++
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/src/clientobject.h b/src/clientobject.h
index 4a77139e2..be24e1388 100644
--- a/src/clientobject.h
+++ b/src/clientobject.h
@@ -54,6 +54,7 @@ class ClientActiveObject : public ActiveObject
 	virtual void removeFromScene(bool permanent){}
 	// 0 <= light_at_pos <= LIGHT_SUN
 	virtual void updateLight(u8 light_at_pos){}
+	virtual void updateLightNoCheck(u8 light_at_pos){}
 	virtual v3s16 getLightPosition(){return v3s16(0,0,0);}
 	virtual core::aabbox3d<f32>* getSelectionBox(){return NULL;}
 	virtual bool getCollisionBox(aabb3f *toset){return false;}
diff --git a/src/content_cao.cpp b/src/content_cao.cpp
index a16bd4efa..0293b7983 100644
--- a/src/content_cao.cpp
+++ b/src/content_cao.cpp
@@ -984,20 +984,38 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
 }
 
 void GenericCAO::updateLight(u8 light_at_pos)
+{
+	// Don't update light of attached one
+	if (getParent() != NULL) {
+		return;
+	}
+
+	updateLightNoCheck(light_at_pos);
+
+	// Update light of all children
+	for (std::vector<u16>::size_type i = 0; i < m_children.size(); i++) {
+		ClientActiveObject *obj = m_env->getActiveObject(m_children[i]);
+		if (obj) {
+			obj->updateLightNoCheck(light_at_pos);
+		}
+	}
+}
+
+void GenericCAO::updateLightNoCheck(u8 light_at_pos)
 {
 	u8 li = decode_light(light_at_pos);
-	if(li != m_last_light)
-	{
+	if (li != m_last_light)	{
 		m_last_light = li;
 		video::SColor color(255,li,li,li);
-		if(m_meshnode)
+		if (m_meshnode) {
 			setMeshColor(m_meshnode->getMesh(), color);
-		if(m_animated_meshnode)
+		} else if (m_animated_meshnode) {
 			setMeshColor(m_animated_meshnode->getMesh(), color);
-		if(m_wield_meshnode)
+		} else if (m_wield_meshnode) {
 			m_wield_meshnode->setColor(color);
-		if(m_spritenode)
+		} else if (m_spritenode) {
 			m_spritenode->setColor(color);
+		}
 	}
 }
 
diff --git a/src/content_cao.h b/src/content_cao.h
index 1e526d1cd..299d6c73e 100644
--- a/src/content_cao.h
+++ b/src/content_cao.h
@@ -178,6 +178,8 @@ class GenericCAO : public ClientActiveObject
 
 	void updateLight(u8 light_at_pos);
 
+	void updateLightNoCheck(u8 light_at_pos);
+
 	v3s16 getLightPosition();
 
 	void updateNodePos();
-- 
GitLab