Merge branch 'RedTheKitsune-better-missing-script-handling'

This commit is contained in:
Wojtek Figat
2023-10-01 21:12:07 +02:00
3 changed files with 98 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
using FlaxEditor.CustomEditors.Editors;
using FlaxEngine;
using FlaxEngine.GUI;
namespace FlaxEditor.CustomEditors.Dedicated;
/// <summary>
/// The missing script editor.
/// </summary>
[CustomEditor(typeof(MissingScript)), DefaultEditor]
public class MissingScriptEditor : GenericEditor
{
/// <inheritdoc />
public override void Initialize(LayoutElementsContainer layout)
{
if (layout.ContainerControl is not DropPanel dropPanel)
{
base.Initialize(layout);
return;
}
dropPanel.HeaderTextColor = Color.OrangeRed;
base.Initialize(layout);
}
}

View File

@@ -0,0 +1,65 @@
#pragma once
#include "Engine/Core/Cache.h"
#include "Engine/Scripting/Script.h"
#include "Engine/Scripting/ScriptingObjectReference.h"
#include "Engine/Serialization/JsonWriters.h"
/// <summary>
/// Actor script component that represents missing script.
/// </summary>
API_CLASS(Attributes="HideInEditor") class FLAXENGINE_API MissingScript : public Script
{
API_AUTO_SERIALIZATION();
DECLARE_SCRIPTING_TYPE(MissingScript);
public:
/// <summary>
/// Namespace and type name of missing script.
/// </summary>
API_FIELD(Attributes="ReadOnly") String MissingTypeName;
/// <summary>
/// Missing script serialized data.
/// </summary>
API_FIELD(Hidden, Attributes="HideInEditor") String Data;
/// <summary>
/// Field for assigning new script to transfer data to.
/// </summary>
API_PROPERTY()
FORCE_INLINE ScriptingObjectReference<Script> GetReferenceScript() const
{
return _referenceScript;
}
/// <summary>
/// Field for assigning new script to transfer data to.
/// </summary>
API_PROPERTY()
void SetReferenceScript(ScriptingObjectReference<Script> value)
{
_referenceScript = value;
if(Data.IsEmpty()) return;
MapToReferenceScript();
}
private:
ScriptingObjectReference<Script> _referenceScript;
void MapToReferenceScript()
{
rapidjson_flax::Document doc;
doc.Parse(Data.ToStringAnsi().GetText());
auto modifier = Cache::ISerializeModifier.Get();
_referenceScript->Deserialize(doc, modifier.Value);
this->DeleteObject();
}
};
inline MissingScript::MissingScript(const SpawnParams& params) : Script(params){}

View File

@@ -1,6 +1,7 @@
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
#include "SceneObjectsFactory.h"
#include "Components/MissingScript.h"
#include "Engine/Level/Actor.h"
#include "Engine/Level/Prefabs/Prefab.h"
#include "Engine/Content/Content.h"
@@ -240,6 +241,12 @@ void SceneObjectsFactory::HandleObjectDeserializationError(const ISerializable::
Actor* parent = Scripting::FindObject<Actor>(parentId);
if (parent)
{
MissingScript* dummyScript = parent->AddScript<MissingScript>();
const auto parentIdMember = value.FindMember("TypeName");
dummyScript->MissingTypeName = parentIdMember->value.GetString();
dummyScript->Data = String(buffer.GetString());
LOG(Warning, "Parent actor of the missing object: {0}", parent->GetName());
}
}