3 name:
"Check Ruin Models and Usage",
5 description:
"Destruction configuration plugin to:\n- Find .xob _Ruin files that do not have an associated Prefab\n- Find house_base Prefabs that do not have the _Ruin Prefab associated",
6 wbModules: {
"ResourceManager" },
7 awesomeFontCode: 0xE4D4)]
8class SCR_CheckRuinModelsAndUsagePlugin : WorkbenchPlugin
11 protected bool m_bPrintResourceNames;
13 [
Attribute(defvalue:
"1",
desc:
"Search in all addons - if unchecked, search only in " + BASE_PREFIX +
" and " + ADDON_PREFIX)]
14 protected bool m_bSearchInAllAddons;
16 protected static const string BASE_PREFIX =
"$ArmaReforger:";
17 protected static const string ADDON_PREFIX =
"$BuildingDestruction:";
18 protected static const string XOBS_DIR =
"Assets";
19 protected static const string PREFABS_DIR =
"Prefabs";
22 protected override void Run()
25 array<ResourceName> ruinPrefabs = GetRuinPrefabs();
26 int ruinPrefabsCount = ruinPrefabs.Count();
28 array<ResourceName> prefablessRuinModels = GetRuinModelsWithoutPrefabs(ruinPrefabs);
29 array<ResourceName> unassignedRuinPrefabs = GetUnassignedRuinPrefabs(ruinPrefabs);
31 if (m_bPrintResourceNames)
45 Print(
"Total _Ruin Prefabs: " + ruinPrefabs.Count(),
LogLevel.NORMAL);
46 Print(
"Ruin XOBs without Prefab: " + prefablessRuinModels.Count(),
LogLevel.NORMAL);
47 Print(
"Unused Ruin Prefabs: " + unassignedRuinPrefabs.Count(),
LogLevel.NORMAL);
53 protected array<ResourceName> GetRuinModelsWithoutPrefabs(notnull array<ResourceName> ruinPrefabs)
60 set<ResourceName> ruinXobSet =
new set<ResourceName>();
63 resource =
Resource.Load(ruinPrefab);
64 if (!resource.IsValid())
66 Print(
"Invalid Ruin Prefab (invalid resource) " + ruinPrefab,
LogLevel.WARNING);
70 baseResourceObject = resource.GetResource();
71 if (!baseResourceObject)
73 Print(
"Invalid Ruin Prefab (no baseResourceObject) " + ruinPrefab,
LogLevel.WARNING);
77 entitySource = baseResourceObject.ToEntitySource();
80 Print(
"Invalid Ruin Prefab (no entitySource) " + ruinPrefab,
LogLevel.WARNING);
87 Print(
"Invalid Ruin Prefab (no model) " + ruinPrefab,
LogLevel.NORMAL);
91 ruinXobSet.Insert(ruinXOB);
94 array<ResourceName> result = {};
95 array<ResourceName> ruinXOBs = GetRuinXOBs();
98 if (!ruinXobSet.Contains(ruinXOB))
99 result.Insert(ruinXOB);
113 meshComp.Get(
"Object", result);
119 protected array<ResourceName> GetUnassignedRuinPrefabs(notnull array<ResourceName> ruinPrefabs)
123 array<ResourceName> houseBases = GetHouseBasePrefabs();
129 set<ResourceName> usedRuinPrefabSet =
new set<ResourceName>();
132 resource =
Resource.Load(houseBase);
133 if (!resource.IsValid())
135 Print(
"Invalid building Prefab (invalid resource) " + houseBase,
LogLevel.WARNING);
139 baseResourceObject = resource.GetResource();
140 if (!baseResourceObject)
142 Print(
"Invalid building Prefab (no baseResourceObject) " + houseBase,
LogLevel.WARNING);
146 entitySource = baseResourceObject.ToEntitySource();
149 Print(
"Invalid building Prefab (no entitySource) " + houseBase,
LogLevel.WARNING);
153 type = entitySource.GetClassName().ToType();
157 ResourceName ruinPrefab = GetRuinFromBaseBuildingPrefab(entitySource);
164 usedRuinPrefabSet.Insert(ruinPrefab);
167 array<ResourceName> result = {};
170 if (!usedRuinPrefabSet.Contains(ruinPrefab))
171 result.Insert(ruinPrefab);
191 for (
int i, count = effects.Count(); i < count; ++i)
193 effect = effects.Get(i);
194 type = effect.GetClassName().ToType();
198 if (effect.Get(
"m_sRuinsPrefab", result) && result)
206 protected array<ResourceName> GetRuinPrefabs()
208 if (m_bSearchInAllAddons)
211 array<ResourceName> result = {};
218 protected array<ResourceName> GetRuinXOBs()
220 if (m_bSearchInAllAddons)
223 array<ResourceName> result = {};
230 protected array<ResourceName> GetHouseBasePrefabs()
232 if (m_bSearchInAllAddons)
235 array<ResourceName> result = {};
244 Workbench.ScriptDialog(
"Check Ruin Models and Usage",
"",
this);
249 protected int CloseButton()
ResourceName resourceName
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
class WorkbenchDialog_AbortRetryIgnore ButtonAttribute("OK", true)
Object holding reference to resource. In destructor release the resource.
static array< ResourceName > SearchWorkbenchResources(array< string > fileExtensions=null, array< string > searchStrArray=null, string rootPath="", bool recursive=true)
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
SCR_FieldOfViewSettings Attribute