Fix various crashes
This commit is contained in:
@@ -144,7 +144,10 @@ BehaviorKnowledge::~BehaviorKnowledge()
|
|||||||
|
|
||||||
void BehaviorKnowledge::InitMemory(BehaviorTree* tree)
|
void BehaviorKnowledge::InitMemory(BehaviorTree* tree)
|
||||||
{
|
{
|
||||||
ASSERT_LOW_LAYER(!Tree && tree);
|
if (Tree)
|
||||||
|
FreeMemory();
|
||||||
|
if (!tree)
|
||||||
|
return;
|
||||||
Tree = tree;
|
Tree = tree;
|
||||||
Blackboard = Variant::NewValue(tree->Graph.Root->BlackboardType);
|
Blackboard = Variant::NewValue(tree->Graph.Root->BlackboardType);
|
||||||
RelevantNodes.Resize(tree->Graph.NodesCount, false);
|
RelevantNodes.Resize(tree->Graph.NodesCount, false);
|
||||||
|
|||||||
@@ -445,6 +445,8 @@ void SceneObjectsFactory::SetupPrefabInstances(Context& context, const PrefabSyn
|
|||||||
const SceneObject* obj = data.SceneObjects[i];
|
const SceneObject* obj = data.SceneObjects[i];
|
||||||
const Guid id = obj ? obj->GetID() : JsonTools::GetGuid(stream, "ID");
|
const Guid id = obj ? obj->GetID() : JsonTools::GetGuid(stream, "ID");
|
||||||
auto prefab = Content::LoadAsync<Prefab>(prefabId);
|
auto prefab = Content::LoadAsync<Prefab>(prefabId);
|
||||||
|
if (!prefab)
|
||||||
|
continue;
|
||||||
|
|
||||||
// Check if it's parent is in the same prefab
|
// Check if it's parent is in the same prefab
|
||||||
int32 index;
|
int32 index;
|
||||||
|
|||||||
@@ -1235,16 +1235,16 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp
|
|||||||
const bool withInterfaces = !mMethod->IsStatic() && mMethod->GetParentClass()->IsInterface();
|
const bool withInterfaces = !mMethod->IsStatic() && mMethod->GetParentClass()->IsInterface();
|
||||||
if (!mMethod->IsStatic())
|
if (!mMethod->IsStatic())
|
||||||
{
|
{
|
||||||
// Box instance into C# object
|
// Box instance into C# object (and validate the type)
|
||||||
MObject* instanceObject = MUtils::BoxVariant(instance);
|
MObject* instanceObject = MUtils::BoxVariant(instance);
|
||||||
const MClass* instanceObjectClass = MCore::Object::GetClass(instanceObject);
|
|
||||||
|
|
||||||
// Validate instance
|
|
||||||
if (!instanceObject || !instanceObjectClass->IsSubClassOf(mMethod->GetParentClass(), withInterfaces))
|
|
||||||
{
|
|
||||||
if (!instanceObject)
|
if (!instanceObject)
|
||||||
|
{
|
||||||
LOG(Error, "Failed to call method '{0}.{1}' (args count: {2}) without object instance", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount);
|
LOG(Error, "Failed to call method '{0}.{1}' (args count: {2}) without object instance", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount);
|
||||||
else
|
return true;
|
||||||
|
}
|
||||||
|
const MClass* instanceObjectClass = MCore::Object::GetClass(instanceObject);
|
||||||
|
if (!instanceObjectClass->IsSubClassOf(mMethod->GetParentClass(), withInterfaces))
|
||||||
|
{
|
||||||
LOG(Error, "Failed to call method '{0}.{1}' (args count: {2}) with invalid object instance of type '{3}'", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount, String(MUtils::GetClassFullname(instanceObject)));
|
LOG(Error, "Failed to call method '{0}.{1}' (args count: {2}) with invalid object instance of type '{3}'", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount, String(MUtils::GetClassFullname(instanceObject)));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user