3 name:
" Ruin Prefab Assigner",
5 description:
"Assign Ruin Prefab to building Prefabs with a Ruin in the same directory",
6 wbModules: {
"WorldEditor" },
7 awesomeFontCode: 0xF6BE)]
8class SCR_RuinPrefabAssignerPlugin : WorkbenchPlugin
10 protected static const string PREFAB_EXTENSION =
"et";
11 protected static const string PREFAB_EXTENSION_DOTTED =
"." + PREFAB_EXTENSION;
14 protected override void Run()
16 WorldEditorAPI worldEditorAPI = SCR_WorldEditorToolHelper.GetWorldEditorAPI();
30 array<ref ContainerIdPathEntry> weApiPath = {};
31 array<string> ruinPrefabEndings = {
"_ruin",
"_Ruin",
"_ruins",
"_Ruins" };
32 array<string> basePrefabEndings = {
"_base",
"_Base" };
36 string ruinRelativeFilePath = ruinPrefab.GetPath();
37 if (!ruinRelativeFilePath)
40 string ruinFileName =
FilePath.StripExtension(
FilePath.StripPath(ruinRelativeFilePath));
41 if (ruinFileName.EndsWith(
"_base"))
46 Print(
"skipping an invalid ruin filename (must END with _[Rr]uin(s), no? what's the standard?) - " + ruinRelativeFilePath,
LogLevel.WARNING);
50 string relativeDirectory =
FilePath.StripFileName(ruinRelativeFilePath);
54 string buildingFileNameWithoutExtension = ruinFileName.Substring(0, ruinFileName.LastIndexOf(
SCR_StringHelper.UNDERSCORE));
55 string baseBuildingRelativeFilePath;
56 foreach (
string basePrefabEnding : basePrefabEndings)
58 if (
FileIO.FileExists(relativeDirectory + buildingFileNameWithoutExtension + basePrefabEnding + PREFAB_EXTENSION_DOTTED))
60 baseBuildingRelativeFilePath = relativeDirectory + buildingFileNameWithoutExtension + basePrefabEnding + PREFAB_EXTENSION_DOTTED;
65 if (!baseBuildingRelativeFilePath)
67 Print(
"Cannot find the base building Prefab for " + ruinPrefab,
LogLevel.WARNING);
71 ResourceName baseBuildingPrefab = Workbench.GetResourceName(baseBuildingRelativeFilePath);
72 if (!baseBuildingPrefab)
74 Print(
"Skipping base building Prefab, not registered - " + baseBuildingRelativeFilePath,
LogLevel.WARNING);
78 resource =
Resource.Load(baseBuildingPrefab);
79 if (!resource.IsValid())
82 baseResourceObject = resource.GetResource();
83 if (!baseResourceObject)
86 entitySource = baseResourceObject.ToBaseContainer();
91 if (componentIndex < 0)
93 Print(
"Base building Prefab does not have an SCR_DestructibleBuildingComponent component - " + baseBuildingPrefab,
LogLevel.WARNING);
97 componentSource = entitySource.GetComponent(componentIndex);
100 Print(
"Base building Prefab does not have an SCR_DestructibleBuildingComponent component (but has an index?!) - " + baseBuildingPrefab,
LogLevel.WARNING);
104 effects = componentSource.GetObjectArray(
"m_aEffects");
107 Print(
"Base building Prefab does not have SCR_DestructibleBuildingComponent's m_aEffects initialised - " + baseBuildingPrefab,
LogLevel.WARNING);
112 int effectIndex = -1;
114 int effectsCount = effects.Count();
115 for (
int i; i < effectsCount; ++i)
117 effect = effects.Get(i);
118 type = effect.GetClassName().ToType();
122 if (effect.Get(
"m_sRuinsPrefab", baseBuildingRuinPrefab))
124 if (baseBuildingRuinPrefab)
126 if (baseBuildingRuinPrefab == ruinPrefab)
128 Print(
"Ruin already set - " + baseBuildingPrefab +
" ruin is " + ruinFileName,
LogLevel.NORMAL);
134 Print(
"Ruin already set to something different - " + baseBuildingPrefab +
"\nwant to set: " + ruinPrefab +
"\nis currently: " + baseBuildingRuinPrefab,
LogLevel.NORMAL);
154 if (!worldEditorAPI.CreateObjectArrayVariableMember(entitySource, weApiPath,
"m_aEffects",
"SCR_TimedPrefab", effectsCount))
156 Print(
"Cannot create a new m_aEffects member - " + baseBuildingPrefab,
LogLevel.WARNING);
160 Print(
"Successful creation of a new m_aEffects member",
LogLevel.NORMAL);
161 effectIndex = effectsCount;
165 if (!worldEditorAPI.SetVariableValue(entitySource, weApiPath,
"m_sRuinsPrefab", ruinPrefab))
167 Print(
"Cannot set m_sRuinsPrefab to the wanted value - " + baseBuildingPrefab,
LogLevel.WARNING);
193 protected void SCR_RuinPrefabAssignerPlugin();
void ContainerIdPathEntry(string propertyName, int index=-1)
Object holding reference to resource. In destructor release the resource.
static bool EndsWithAny(string input, notnull array< string > lineEnds)
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.