diff --git a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs index bb18f6de0..81ca30361 100644 --- a/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/MissingScriptEditor.cs @@ -67,25 +67,6 @@ public class MissingScriptEditor : GenericEditor base.Initialize(layout); } - private void FindActorsWithMatchingMissingScript(List missingScripts) - { - foreach (Actor actor in Level.GetActors(typeof(Actor))) - { - for (int scriptIndex = 0; scriptIndex < actor.ScriptsCount; scriptIndex++) - { - Script actorScript = actor.Scripts[scriptIndex]; - if (actorScript is not MissingScript missingActorScript) - continue; - - MissingScript currentMissing = Values[0] as MissingScript; - if (missingActorScript.MissingTypeName != currentMissing.MissingTypeName) - continue; - - missingScripts.Add(missingActorScript); - } - } - } - private void RunReplacementMultiCast(List actions) { if (actions.Count == 0) @@ -104,16 +85,54 @@ public class MissingScriptEditor : GenericEditor } } - private void ReplaceScript(ScriptType script, bool replaceAllInScene) + private void GetMissingScripts(Actor actor, string currentMissingTypeName, List missingScripts) { - var actions = new List(4); + // Iterate over the scripts of this actor + for (int i = 0; i < actor.ScriptsCount; i++) + { + if (actor.GetScript(i) is MissingScript otherMissing && + otherMissing.MissingTypeName == currentMissingTypeName) + { + missingScripts.Add(otherMissing); + } + } + // Iterate over this actor children (recursive) + for (int i = 0; i < actor.ChildrenCount; i++) + { + GetMissingScripts(actor.GetChild(i), currentMissingTypeName, missingScripts); + } + } + + private void ReplaceScript(ScriptType script) + { var missingScripts = new List(); - if (!replaceAllInScene) - missingScripts.Add((MissingScript)Values[0]); + var currentMissing = (MissingScript)Values[0]; + var currentMissingTypeName = currentMissing.MissingTypeName; + if (_shouldReplaceAllCheckbox.Checked) + { + if (currentMissing.Scene == null && currentMissing.Actor != null) + { + // Find all missing scripts in prefab instance + GetMissingScripts(currentMissing.Actor.GetPrefabRoot(), currentMissingTypeName, missingScripts); + } + else + { + // Find all missing scripts in all loaded levels that match this type + for (int i = 0; i < Level.ScenesCount; i++) + { + GetMissingScripts(Level.GetScene(i), currentMissingTypeName, missingScripts); + } + } + } else - FindActorsWithMatchingMissingScript(missingScripts); + { + // Use the current instance only + foreach (var value in Values) + missingScripts.Add((MissingScript)value); + } + var actions = new List(4); foreach (var missingScript in missingScripts) actions.Add(AddRemoveScript.Add(missingScript.Actor, script)); RunReplacementMultiCast(actions); @@ -149,7 +168,7 @@ public class MissingScriptEditor : GenericEditor var cm = new ItemsListContextMenu(180); for (int i = 0; i < scripts.Count; i++) cm.AddItem(new TypeSearchPopup.TypeItemView(scripts[i])); - cm.ItemClicked += item => ReplaceScript((ScriptType)item.Tag, _shouldReplaceAllCheckbox.Checked); + cm.ItemClicked += item => ReplaceScript((ScriptType)item.Tag); cm.SortItems(); cm.Show(_dropPanel, _replaceScriptButton.BottomLeft - new Float2((cm.Width - _replaceScriptButton.Width) / 2, 0)); }