[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15548] trunk/blender/source/gameengine: BGE bug fix (good for 2.47): automatic detection that target object of AddObject actuator is being deleted to avoid crash (bad game design anyway)

Benoit Bolsee benoit.bolsee at online.be
Sat Jul 12 14:10:28 CEST 2008


Revision: 15548
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15548
Author:   ben2610
Date:     2008-07-12 14:10:27 +0200 (Sat, 12 Jul 2008)

Log Message:
-----------
BGE bug fix (good for 2.47): automatic detection that target object of AddObject actuator is being deleted to avoid crash (bad game design anyway)

Modified Paths:
--------------
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2008-07-12 11:57:21 UTC (rev 15547)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2008-07-12 12:10:27 UTC (rev 15548)
@@ -539,7 +539,7 @@
 						
 						// does the 'original' for replication exists, and 
 						// is it in a non-active layer ?
-						CValue* originalval = NULL;
+						SCA_IObject* originalval = NULL;
 						if (editobact->ob && !(editobact->ob->lay & activeLayerBitInfo))
 							originalval = converter->FindGameObject(editobact->ob);
 						

Modified: trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp	2008-07-12 11:57:21 UTC (rev 15547)
+++ trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.cpp	2008-07-12 12:10:27 UTC (rev 15548)
@@ -48,7 +48,7 @@
 /* ------------------------------------------------------------------------- */
 
 KX_SCA_AddObjectActuator::KX_SCA_AddObjectActuator(SCA_IObject *gameobj,
-												   CValue* original,
+												   SCA_IObject *original,
 												   int time,
 												   SCA_IScene* scene,
 												   const MT_Vector3& linvel,
@@ -61,6 +61,9 @@
 	m_linear_velocity(linvel),
 	m_localFlag(local)
 {
+	if (m_OriginalObject)
+		m_OriginalObject->RegisterActuator(this);
+
 	m_lastCreatedObject = NULL;
 	m_timeProp = time;
 } 
@@ -69,6 +72,8 @@
 
 KX_SCA_AddObjectActuator::~KX_SCA_AddObjectActuator()
 { 
+	if (m_OriginalObject)
+		m_OriginalObject->UnregisterActuator(this);
 	if (m_lastCreatedObject)
 		m_lastCreatedObject->Release();
 } 
@@ -108,14 +113,31 @@
 
 	// this will copy properties and so on...
 	replica->ProcessReplica();
-	replica->m_lastCreatedObject=NULL;
 	CValue::AddDataToReplica(replica);
 
 	return replica;
 }
 
+void KX_SCA_AddObjectActuator::ProcessReplica()
+{
+	if (m_OriginalObject)
+		m_OriginalObject->RegisterActuator(this);
+	m_lastCreatedObject=NULL;
+	SCA_IActuator::ProcessReplica();
+}
 
+bool KX_SCA_AddObjectActuator::UnlinkObject(SCA_IObject* clientobj)
+{
+	if (clientobj == m_OriginalObject)
+	{
+		// this object is being deleted, we cannot continue to track it.
+		m_OriginalObject = NULL;
+		return true;
+	}
+	return false;
+}
 
+
 /* ------------------------------------------------------------------------- */
 /* Python functions                                                          */
 /* ------------------------------------------------------------------------- */
@@ -181,7 +203,11 @@
 	PyObject* gameobj;
 	if (PyArg_ParseTuple(args, "O!", &KX_GameObject::Type, &gameobj))
 	{
-		m_OriginalObject = (CValue*)gameobj;
+		if (m_OriginalObject != NULL)
+			m_OriginalObject->UnregisterActuator(this);
+		m_OriginalObject = (SCA_IObject*)gameobj;
+		if (m_OriginalObject)
+			m_OriginalObject->RegisterActuator(this);
 		Py_Return;
 	}
 	PyErr_Clear();
@@ -189,8 +215,11 @@
 	char* objectname;
 	if (PyArg_ParseTuple(args, "s", &objectname))
 	{
-		m_OriginalObject= (CValue*)SCA_ILogicBrick::m_sCurrentLogicManager->GetGameObjectByName(STR_String(objectname));;
-		
+		if (m_OriginalObject != NULL)
+			m_OriginalObject->UnregisterActuator(this);
+		m_OriginalObject = (SCA_IObject*)SCA_ILogicBrick::m_sCurrentLogicManager->GetGameObjectByName(STR_String(objectname));;
+		if (m_OriginalObject)
+			m_OriginalObject->RegisterActuator(this);
 		Py_Return;
 	}
 	

Modified: trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h	2008-07-12 11:57:21 UTC (rev 15547)
+++ trunk/blender/source/gameengine/Ketsji/KX_SCA_AddObjectActuator.h	2008-07-12 12:10:27 UTC (rev 15548)
@@ -53,7 +53,7 @@
 	int	m_timeProp;
 
 	/// Original object reference (object to replicate)  	
-	CValue*	m_OriginalObject;
+	SCA_IObject*	m_OriginalObject;
 
 	/// Object will be added to the following scene
 	SCA_IScene*	m_scene;
@@ -75,7 +75,7 @@
 
 	KX_SCA_AddObjectActuator(
 		SCA_IObject *gameobj,
-		CValue* original,
+		SCA_IObject *original,
 		int time,
 		SCA_IScene* scene,
 		const MT_Vector3& linvel,
@@ -89,7 +89,13 @@
 	GetReplica(
 	) ;
 
+	virtual void 
+	ProcessReplica();
+
 	virtual bool 
+	UnlinkObject(SCA_IObject* clientobj);
+
+	virtual bool 
 	Update();
 
 	virtual PyObject*  





More information about the Bf-blender-cvs mailing list