private static void RandomizeDancer(ExportEntry skeletalMeshActorMatArchetype) { // Install new head and body assets var newInfo = IlliumHub.DancerOptions.RandomElement(); while (newInfo.Location != null || newInfo.Rotation != null || (newInfo.BodyAsset != null && !newInfo.BodyAsset.IsAssetFileAvailable()) || (newInfo.HeadAsset != null && !newInfo.HeadAsset.IsAssetFileAvailable())) { // Make sure assets are available, if not, repick // I don't want anything that requires specific positioning data newInfo = IlliumHub.DancerOptions.RandomElement(); } var newBody = PackageTools.PortExportIntoPackage(skeletalMeshActorMatArchetype.FileRef, newInfo.BodyAsset.GetAsset()); var bodySM = skeletalMeshActorMatArchetype.GetProperty <ObjectProperty>("SkeletalMeshComponent").ResolveToEntry(skeletalMeshActorMatArchetype.FileRef) as ExportEntry; var headSM = skeletalMeshActorMatArchetype.GetProperty <ObjectProperty>("HeadMesh").ResolveToEntry(skeletalMeshActorMatArchetype.FileRef) as ExportEntry; bodySM.WriteProperty(new ObjectProperty(newBody.UIndex, "SkeletalMesh")); if (newInfo.HeadAsset != null) { var newHead = PackageTools.PortExportIntoPackage(skeletalMeshActorMatArchetype.FileRef, newInfo.HeadAsset.GetAsset()); headSM.WriteProperty(new ObjectProperty(newHead.UIndex, "SkeletalMesh")); } else if (!newInfo.KeepHead) { headSM.RemoveProperty("SkeletalMesh"); } if (newInfo.DrawScale != 1) { // Install DS3D on the archetype. It works. Not gonna question it var ds = new CFVector3() { X = newInfo.DrawScale, Y = newInfo.DrawScale, Z = newInfo.DrawScale, }; skeletalMeshActorMatArchetype.WriteProperty(ds.ToLocationStructProperty("DrawScale3D")); //hack } if (newInfo.MorphFace != null) { var newHead = PackageTools.PortExportIntoPackage(skeletalMeshActorMatArchetype.FileRef, newInfo.MorphFace.GetAsset()); headSM.WriteProperty(new ObjectProperty(newHead.UIndex, "MorphHead")); } }
public static bool RandomizePawnSize(ExportEntry export, RandomizationOption option) { if (!CanRandomize(export)) { return(false); } MERLog.Information($"[{Path.GetFileNameWithoutExtension(export.FileRef.FilePath)}] Randomizing pawn size for " + export.UIndex + ": " + export.InstancedFullPath); var existingSize = export.GetProperty <StructProperty>("DrawScale3D"); CFVector3 d3d = existingSize == null ? new CFVector3() { X = 1, Y = 1, Z = 1 } : CFVector3.FromStructProperty(existingSize, "X", "Y", "Z"); d3d.X *= ThreadSafeRandom.NextFloat(1 - option.SliderValue, 1 + option.SliderValue); d3d.Y *= ThreadSafeRandom.NextFloat(1 - option.SliderValue, 1 + option.SliderValue); d3d.Z *= ThreadSafeRandom.NextFloat(1 - option.SliderValue, 1 + option.SliderValue); export.WriteProperty(d3d.ToStructProperty("X", "Y", "Z", "DrawScale3D", true)); return(true); }
private static void RandomizeDancer() { var loungeF = MERFileSystem.GetPackageFile("BioD_TwrHub_202Lounge.pcc"); if (loungeF != null && File.Exists(loungeF)) { var package = MEPackageHandler.OpenMEPackage(loungeF); var bodySM = package.GetUExport(4509); var headSM = package.GetUExport(2778); // Install new head and body assets var newInfo = DancerOptions.RandomElement(); while (newInfo.BodyAsset != null && !newInfo.BodyAsset.IsAssetFileAvailable()) { // Find another asset that is available MERLog.Information($@"Asset {newInfo.BodyAsset.AssetPath} in {newInfo.BodyAsset.PackageFile} not available, repicking..."); newInfo = DancerOptions.RandomElement(); } var newBody = PackageTools.PortExportIntoPackage(package, newInfo.BodyAsset.GetAsset()); bodySM.WriteProperty(new ObjectProperty(newBody.UIndex, "SkeletalMesh")); if (newInfo.HeadAsset != null) { var newHead = PackageTools.PortExportIntoPackage(package, newInfo.HeadAsset.GetAsset()); headSM.WriteProperty(new ObjectProperty(newHead.UIndex, "SkeletalMesh")); } else if (!newInfo.KeepHead) { headSM.RemoveProperty("SkeletalMesh"); } if (newInfo.DrawScale != 1) { // Install DS3D on the archetype. It works. Not gonna question it var ds = new CFVector3() { X = newInfo.DrawScale, Y = newInfo.DrawScale, Z = newInfo.DrawScale, }; package.GetUExport(619).WriteProperty(ds.ToLocationStructProperty("DrawScale3D")); //hack } // Install any updates to locations/rotations var dancerInstance = package.GetUExport(4510); // contains location data for dancer which may need to be slightly adjusted if (newInfo.Location != null) { dancerInstance.WriteProperty(newInfo.Location.ToLocationStructProperty("Location")); } if (newInfo.Rotation != null) { dancerInstance.WriteProperty(newInfo.Rotation.ToRotatorStructProperty("Rotation")); } if (newInfo.MorphFace != null) { var newHead = PackageTools.PortExportIntoPackage(package, newInfo.MorphFace.GetAsset()); headSM.WriteProperty(new ObjectProperty(newHead.UIndex, "MorphHead")); } MERFileSystem.SavePackage(package); } }