BGE patch: Relink actuators with target within group when duplicating group; generalize protection against object deletion for all actuators that point to objects.
Certain actuators hold a pointer to an objects: Property, SceneCamera, AddObject, Camera, Parent, TractTo. When a group is duplicated, the actuators that point to objects within the group will be relinked to point to the replicated objects and not to the original objects. This helps to setup self-contained group with a camera following a character for example. This feature also works when adding a single object (and all its children) with the AddObject actuator. The second part of the patch extends the protection against object deletion to all the actuators of the above list (previously, only the TrackTo, AddObject and Property actuators were protected). In case the target object of these actuators is deleted, the BGE won't crash.
This commit is contained in:
@@ -724,21 +724,23 @@ void KX_Scene::DupliGroupRecurse(CValue* obj, int level)
|
||||
replica->Release();
|
||||
}
|
||||
|
||||
// relink any pointers as necessary, sort of a temporary solution
|
||||
// the logic must be replicated first because we need
|
||||
// the new logic bricks before relinking
|
||||
vector<KX_GameObject*>::iterator git;
|
||||
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
|
||||
{
|
||||
(*git)->Relink(&m_map_gameobject_to_replica);
|
||||
// add the object in the layer of the parent
|
||||
(*git)->SetLayer(groupobj->GetLayer());
|
||||
}
|
||||
|
||||
// now replicate logic
|
||||
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
|
||||
{
|
||||
(*git)->ReParentLogic();
|
||||
}
|
||||
|
||||
// relink any pointers as necessary, sort of a temporary solution
|
||||
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
|
||||
{
|
||||
// this will also relink the actuator to objects within the hierarchy
|
||||
(*git)->Relink(&m_map_gameobject_to_replica);
|
||||
// add the object in the layer of the parent
|
||||
(*git)->SetLayer(groupobj->GetLayer());
|
||||
}
|
||||
|
||||
// replicate crosslinks etc. between logic bricks
|
||||
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
|
||||
{
|
||||
@@ -805,21 +807,22 @@ SCA_IObject* KX_Scene::AddReplicaObject(class CValue* originalobject,
|
||||
replica->GetSGNode()->AddChild(childreplicanode);
|
||||
}
|
||||
|
||||
// relink any pointers as necessary, sort of a temporary solution
|
||||
vector<KX_GameObject*>::iterator git;
|
||||
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
|
||||
{
|
||||
(*git)->Relink(&m_map_gameobject_to_replica);
|
||||
// add the object in the layer of the parent
|
||||
(*git)->SetLayer(parentobj->GetLayer());
|
||||
}
|
||||
|
||||
// now replicate logic
|
||||
vector<KX_GameObject*>::iterator git;
|
||||
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
|
||||
{
|
||||
(*git)->ReParentLogic();
|
||||
}
|
||||
|
||||
// relink any pointers as necessary, sort of a temporary solution
|
||||
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
|
||||
{
|
||||
// this will also relink the actuators in the hierarchy
|
||||
(*git)->Relink(&m_map_gameobject_to_replica);
|
||||
// add the object in the layer of the parent
|
||||
(*git)->SetLayer(parentobj->GetLayer());
|
||||
}
|
||||
|
||||
// replicate crosslinks etc. between logic bricks
|
||||
for (git = m_logicHierarchicalGameObjects.begin();!(git==m_logicHierarchicalGameObjects.end());++git)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user