private async Task InitializeAsync() { BundleManager ??= await Task.Run(() => Tw3Controller.LoadBundleManager()).ConfigureAwait(false); W3StringManager ??= await Task.Run(() => Tw3Controller.LoadStringsManager()).ConfigureAwait(false); TextureManager ??= await Task.Run(() => Tw3Controller.LoadTextureManager()).ConfigureAwait(false); CollisionManager ??= await Task.Run(() => Tw3Controller.LoadCollisionManager()).ConfigureAwait(false); SoundManager ??= await Task.Run(() => Tw3Controller.LoadSoundManager()).ConfigureAwait(false); SpeechManager ??= await Task.Run(() => Tw3Controller.LoadSpeechManager()).ConfigureAwait(false); // Hash all filepaths _logger.LogString("Starting additional tasks...", Logtype.Important); var relativepaths = ModFiles .Select(_ => _.Substring(_.IndexOf(Path.DirectorySeparatorChar) + 1)) .ToList(); Cr2wResourceManager.Get().RegisterAndWriteCustomPaths(relativepaths); // register all custom classes CR2WManager.Init(FileDirectory, MainController.Get().Logger); _logger.LogString("Finished additional tasks...", Logtype.Success); ServiceLocator.Default.ResolveType <INotificationService>().ShowNotification("WolvenKit", $"Project {Name} has finished loading."); }
private async Task InitializeAsync() { // Hash all filepaths _logger.LogString("Starting additional tasks...", Logtype.Important); var relativepaths = ModFiles .Select(_ => _.Substring(_.IndexOf(Path.DirectorySeparatorChar) + 1)) .ToList(); Cr2wResourceManager.Get().RegisterAndWriteCustomPaths(relativepaths); // register all custom classes CR2WManager.Init(FileDirectory, MainController.Get().Logger); _logger.LogString("Finished additional tasks...", Logtype.Success); ServiceLocator.Default.ResolveType <INotificationService>().ShowNotification("WolvenKit", $"Project {Name} has finished loading."); }
public static void UpdateComboBoxWith(this ComboBox editor, IChunkPtrAccessor ptr) { editor.Items.Add(new PtrComboItem { Text = "", Value = null }); var availableChunks = CR2WManager.GetAvailableTypes(ptr.ReferenceType).Select(_ => _.Name).ToList(); foreach (var chunk in ptr.cr2w.chunks.Where(_ => availableChunks.Contains(_.REDType))) { editor.Items.Add(new PtrComboItem { Text = $"{chunk.REDType} #{chunk.ChunkIndex}", //real index Value = chunk } ); } // add new item editor.Items.Add(new PtrComboItem { Text = $"<Add new chunk ...>", Value = null }); // select item if (ptr.Reference == null) { editor.SelectedIndex = 0; } else { int selIndex = 0; for (int i = 0; i < editor.Items.Count; i++) { if (editor.Items[i].ToString() == $"{ptr.Reference.REDType} #{ptr.Reference.ChunkIndex}") { selIndex = i; break; } } editor.SelectedIndex = selIndex; } }
private static Enum CreateEnum(string value) { if (AssemblyDictionary.EnumExists(value)) { var type = AssemblyDictionary.GetEnumByName(value); Enum e = (Enum)System.Activator.CreateInstance(type); return(e); } else if (CR2WManager.EnumExists(value)) { var type = CR2WManager.GetEnumByName(value); Enum e = (Enum)System.Activator.CreateInstance(type); return(e); } return(null); }
/// <summary> /// The instantiation step of the RedEngine-3 reflection. /// </summary> /// <param name="typename">Can be either a generic type such as CUint32 - then converted with GetWKitTypeFromREDType, or a complex type like a /// pointer to a class, a handle to an import file, an array, a soft reference, a static reference, various buffers, an enum.</param> /// <param name="varname">The variable name</param> /// <param name="cr2w">The cr2w base file</param> /// <param name="parentVariable">The class owning this attribute</param> /// <param name="readUnknownAsBytes"></param> /// <returns></returns> public static CVariable Create(string typename, string varname, CR2WFile cr2w, CVariable parentVariable, bool readUnknownAsBytes = true) { typename = REDReflection.GetWKitBaseTypeFromREDBaseType(typename); var fullname = typename; // check for normal type if (AssemblyDictionary.TypeExists(typename)) { var type = AssemblyDictionary.GetTypeByName(typename); if (type != null) { object instance = System.Activator.CreateInstance(type, cr2w, parentVariable, varname); return(instance as CVariable); } } // check for enum types if (AssemblyDictionary.EnumExists(typename)) { Enum e = (Enum)System.Activator.CreateInstance(AssemblyDictionary.GetEnumByName(typename)); var cenum = MakeGenericEnumType(typeof(CEnum <>), e); return(cenum); } else if (CR2WManager.EnumExists(typename)) { Enum e = (Enum)System.Activator.CreateInstance(CR2WManager.GetEnumByName(typename)); var cenum = MakeGenericEnumType(typeof(CEnum <>), e); return(cenum); } // check for generic type else if (typename.StartsWith('[')) { string generictype = typename.Substring(3); CVariable innerobject = Create(generictype, "", cr2w, null); var arrayacc = MakeArray(typeof(CArrayFixedSize <>), innerobject.GetType()); //arrayacc.Flags = new List<int>() { int.Parse(matchArrayType.Groups[1].Value) }; arrayacc.Elementtype = generictype; return(arrayacc as CVariable); } else if (typename.Contains(':')) { #region GENERIC TYPES string[] splits = typename.Split(':'); string generictype = splits.First(); string innertype = string.Join(":", splits.Skip(1)); // e.g. handle:CEntityTemplate switch (generictype) { case "CHandle": case "handle": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CHandle <>), innerobject)); } case "wCHandle": case "whandle": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(wCHandle <>), innerobject)); } case "CrRef": case "rRef": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(rRef <>), innerobject)); } case "CraRef": case "raRef": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(raRef <>), innerobject)); } case "array": { // match pattern e.g. // array: (array:)Float // array of array: (array:)handle:meshMeshAppearance CVariable innerobject = Create(innertype, "", cr2w, null); IArrayAccessor arrayacc = MakeArray(typeof(CArray <>), innerobject.GetType()); arrayacc.Elementtype = innertype; return(arrayacc as CVariable); } case "static": { typename = generictype; // match pattern e.g. // static: (4),(Uint32) var regArrayType = new Regex(@"(\d+),(.+)"); var matchArrayType = regArrayType.Match(fullname); if (matchArrayType.Success) { CVariable innerobject = Create(matchArrayType.Groups[2].Value, "", cr2w, null); var arrayacc = MakeArray(typeof(CStatic <>), innerobject.GetType()); //arrayacc.Flags = new List<int>() { int.Parse(matchArrayType.Groups[1].Value) }; arrayacc.Elementtype = matchArrayType.Groups[2].Value; return(arrayacc as CVariable); } else { throw new InvalidParsingException($"Invalid static type format: typename: {typename}."); } } case "CEnum": { Enum innerobject = CreateEnum(innertype); return(MakeGenericEnumType(typeof(CEnum <>), innerobject)); } default: { throw new MissingTypeException(generictype); } } #endregion } else { // check if custom type if (CR2WManager.TypeExists(typename)) { var type = CR2WManager.GetTypeByName(typename); object instance = System.Activator.CreateInstance(type, cr2w, parentVariable, varname); return(instance as CVariable); } // this should never happen if (!cr2w.UnknownTypes.Contains(fullname)) { cr2w.UnknownTypes.Add(fullname); } if (readUnknownAsBytes) { return(new CBytes(cr2w, parentVariable, $"UNKNOWN:{typename}:{varname}")); } else { return(null); } } #region LOCAL FUNCTIONS IArrayAccessor MakeArray(Type arraytype, Type generictype) { Type elementType; if (arraytype == typeof(CStatic <>)) { elementType = typeof(CStatic <>).MakeGenericType(generictype); } else if (arraytype == typeof(CArrayFixedSize <>)) { elementType = typeof(CArrayFixedSize <>).MakeGenericType(generictype); } else if (arraytype == typeof(CArray <>)) { elementType = typeof(CArray <>).MakeGenericType(generictype); } else { throw new NotImplementedException(); } var array = System.Activator.CreateInstance(elementType, cr2w, parentVariable, varname) as CVariable; return(array as IArrayAccessor); } CVariable MakeGenericType(Type gentype, CVariable innerobject) { if (innerobject != null) { Type elementType = gentype.MakeGenericType(innerobject.GetType()); CVariable handle = System.Activator.CreateInstance(elementType, cr2w, parentVariable, varname) as CVariable; return(handle); } else { throw new Exception(); } } CVariable MakeGenericEnumType(Type gentype, Enum innerobject) { if (innerobject != null) { Type elementType = gentype.MakeGenericType(innerobject.GetType()); CVariable handle = System.Activator.CreateInstance(elementType, cr2w, parentVariable, varname) as CVariable; return(handle); } else { throw new Exception(); } } #endregion }
/// <summary> /// The instantiation step of the RedEngine-3 reflection. /// </summary> /// <param name="typename">Can be either a generic type such as CUint32 - then converted with GetWKitTypeFromREDType, or a complex type like a /// pointer to a class, a handle to an import file, an array, a soft reference, a static reference, various buffers, an enum.</param> /// <param name="varname">The variable name</param> /// <param name="cr2w">The cr2w base file</param> /// <param name="parentVariable">The class owning this attribute</param> /// <param name="readUnknownAsBytes"></param> /// <returns></returns> public static CVariable Create(string typename, string varname, CR2WFile cr2w, CVariable parentVariable, bool readUnknownAsBytes = true) { typename = REDReflection.GetWKitBaseTypeFromREDBaseType(typename); var fullname = typename; // check for normal type if (AssemblyDictionary.TypeExists(typename)) { var type = AssemblyDictionary.GetTypeByName(typename); if (type != null) { object instance = Activator.CreateInstance(type, cr2w, parentVariable, varname); return(instance as CVariable); } } // check for enum types if (AssemblyDictionary.EnumExists(typename)) { Enum e = (Enum)Activator.CreateInstance(AssemblyDictionary.GetEnumByName(typename)); var cenum = MakeGenericEnumType(typeof(CEnum <>), e); return(cenum); } else if (CR2WManager.EnumExists(typename)) { Enum e = (Enum)Activator.CreateInstance(CR2WManager.GetEnumByName(typename)); var cenum = MakeGenericEnumType(typeof(CEnum <>), e); return(cenum); } // check for generic type else if (typename.Contains(':')) { #region GENERIC TYPES string[] splits = typename.Split(':'); string generictype = splits.First(); string innertype = string.Join(":", splits.Skip(1)); // e.g. handle:CEntityTemplate switch (generictype) { case "CHandle": case "handle": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CHandle <>), innerobject)); } case "CPtr": case "ptr": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CPtr <>), innerobject)); } case "CSoft": case "soft": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CSoft <>), innerobject)); } case "array": { // match pattern e.g. // array: Array: (2),(0),(handle:CBitmapTexture) // array: Array: (2),(0),(Int32) // array of array: Array: (2),(0),(Array:133,0,EngineQsTransform) string[] arraysplits = innertype.Split(','); string flag1 = arraysplits[0]; string flag2 = arraysplits[1]; string body = string.Join(",", arraysplits.Skip(2)); if (arraysplits.Length >= 3) { //byte arrays, these can be huge, using ordinary arrays is just too slow. if (body == "Uint8" || body == "Int8") { var bytearray = new CByteArray(cr2w, parentVariable, varname); // save the actual redengine type for serialization: e.g. array:2,0,Uint8 bytearray.InternalType = typename; return(bytearray); } // all other arrays CVariable innerobject = Create(body, "", cr2w, null); IArrayAccessor arrayacc = MakeArray(typeof(CArray <>), innerobject.GetType()); arrayacc.Flags = new List <int>() { int.Parse(flag1), int.Parse(flag2) }; if (innerobject is IArrayAccessor accessor && accessor.Flags != null) { arrayacc.Flags.AddRange(accessor.Flags); } arrayacc.Elementtype = body; return(arrayacc as CVariable); } else { CVariable innerobject = Create(innertype, "", cr2w, null); IArrayAccessor arrayacc = MakeArray(typeof(CArray <>), innerobject.GetType()); arrayacc.Elementtype = body; return(arrayacc as CVariable); } } case "static": { typename = generictype; // match pattern e.g. // static: (4),(Uint32) var regArrayType = new Regex(@"(\d+),(.+)"); var matchArrayType = regArrayType.Match(fullname); if (matchArrayType.Success) { CVariable innerobject = Create(matchArrayType.Groups[2].Value, "", cr2w, null); var arrayacc = MakeArray(typeof(CStatic <>), innerobject.GetType()); arrayacc.Flags = new List <int>() { int.Parse(matchArrayType.Groups[1].Value) }; arrayacc.Elementtype = matchArrayType.Groups[2].Value; return(arrayacc as CVariable); } else { throw new InvalidParsingException($"Invalid static type format: typename: {typename}."); } } case "CBufferUInt16": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CBufferUInt16 <>), innerobject)); } case "CBufferUInt32": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CBufferUInt32 <>), innerobject)); } case "CBufferVLQInt32": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CBufferVLQInt32 <>), innerobject)); } case "CCompressedBuffer": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CCompressedBuffer <>), innerobject)); } case "CPaddedBuffer": { CVariable innerobject = Create(innertype, "", cr2w, null); return(MakeGenericType(typeof(CPaddedBuffer <>), innerobject)); } case "CEnum": { Enum innerobject = CreateEnum(innertype); return(MakeGenericEnumType(typeof(CEnum <>), innerobject)); } default: { throw new NotImplementedException(); } } #endregion } else { #region FIXED SIZE ARRAYS // match pattern e.g. // [(1)](Bezier2dHandle) var regFixedSizeArray = new Regex(@"^\[(\d+)\](.+)$"); var matchFixedSizeArray = regFixedSizeArray.Match(typename); if (matchFixedSizeArray.Success) { CVariable innerobject = Create(matchFixedSizeArray.Groups[2].Value, "", cr2w, null); var arrayacc = MakeArray(typeof(CArrayFixedSize <>), innerobject.GetType()); arrayacc.Flags = new List <int>() { int.Parse(matchFixedSizeArray.Groups[1].Value) }; arrayacc.Elementtype = matchFixedSizeArray.Groups[2].Value; return(arrayacc as CVariable); } #endregion if (fullname.Contains("@SItem")) { cr2w.UnknownTypes.Add($"Congratulations! You have found one of the hidden e3 files! These files are special." + $" If you edited this file and are experiencing errors, please contact a member of the Wkit Team. ErrorCode: {fullname}"); return(new SItem(cr2w, parentVariable, varname)); } else if (fullname.Contains("#CEnvironmentDefinition")) { cr2w.UnknownTypes.Add($"Congratulations! You have found one of the hidden e3 files! These files are special." + $" If you edited this file and are experiencing errors, please contact a member of the Wkit Team. ErrorCode: {fullname}"); return(new CHandle <CEnvironmentDefinition>(cr2w, parentVariable, varname)); } else { // check if custom type if (CR2WManager.TypeExists(typename)) { var type = CR2WManager.GetTypeByName(typename); object instance = Activator.CreateInstance(type, cr2w, parentVariable, varname); return(instance as CVariable); } // this should never happen if (!cr2w.UnknownTypes.Contains(fullname)) { cr2w.UnknownTypes.Add(fullname); } if (readUnknownAsBytes) { return(new CBytes(cr2w, parentVariable, $"UNKNOWN:{typename}:{varname}")); } else { return(null); } } } #region LOCAL FUNCTIONS IArrayAccessor MakeArray(Type arraytype, Type generictype) { Type elementType; if (arraytype == typeof(CStatic <>)) { elementType = typeof(CStatic <>).MakeGenericType(generictype); } else if (arraytype == typeof(CArrayFixedSize <>)) { elementType = typeof(CArrayFixedSize <>).MakeGenericType(generictype); } else if (arraytype == typeof(CArray <>)) { elementType = typeof(CArray <>).MakeGenericType(generictype); } else { throw new NotImplementedException(); } var array = Activator.CreateInstance(elementType, cr2w, parentVariable, varname) as CVariable; return(array as IArrayAccessor); } CVariable MakeGenericType(Type gentype, CVariable innerobject) { if (innerobject != null) { Type elementType = gentype.MakeGenericType(innerobject.GetType()); CVariable handle = Activator.CreateInstance(elementType, cr2w, parentVariable, varname) as CVariable; return(handle); } else { throw new Exception(); } } CVariable MakeGenericEnumType(Type gentype, Enum innerobject) { if (innerobject != null) { Type elementType = gentype.MakeGenericType(innerobject.GetType()); CVariable handle = Activator.CreateInstance(elementType, cr2w, parentVariable, varname) as CVariable; return(handle); } else { throw new Exception(); } } #endregion }
private void treeView_CellEditStarting(object sender, CellEditEventArgs e) { if (!(e.RowObject is IEditableVariable editableVariable)) { return; } switch (e.Column.AspectName) { //var variable = (e.RowObject as VariableListNode).Variable; case "REDValue": { // if variant is null, ask the user to create a new wrapped cvar if (editableVariable is IVariantAccessor ivariant && ivariant.Variant == null) { var availableTypes = CR2WManager.GetAvailableTypes(nameof(IReferencable)).Select(_ => _.Name); var variantType = new Utility.ProductionWindowFactory().ShowAddChunkFormModal(availableTypes); var variant = CR2WTypeManager.Create(variantType, "Variant", editableVariable.cr2w, (CVariable)editableVariable); variant.IsSerialized = true; ivariant.Variant = variant; editableVariable.IsSerialized = true; } e.Control = EditorHandler.GetEditor(editableVariable); if (e.Control != null) { e.Control.Location = new Point(e.CellBounds.Location.X, e.CellBounds.Location.Y - 1); e.Control.Width = e.CellBounds.Width; // update references for pointer type variables if (editableVariable is IChunkPtrAccessor iptr && e.Control is ComboBox editor) { editor.SelectedIndexChanged += delegate(object o, EventArgs _e) { var ptrcomboitem = (PtrComboItem)((ComboBox)o).SelectedItem; if (ptrcomboitem != null) { if (ptrcomboitem.Text == $"<Add new chunk ...>") { // raise event viewModel.AddNewChunkFor(iptr); // select item editor.UpdateComboBoxWith(iptr); } else { iptr.Reference = ptrcomboitem.Value; } } }; } if (e.Control is ByteArrayEditor byteArrayEditor) { byteArrayEditor.RequestBytesOpen += ByteArrayEditor_RequestBytesOpen; } if (e.Control is ArrayEditor arrayEditor) { arrayEditor.parentref = this; arrayEditor.RequestBytesOpen += ByteArrayEditor_RequestBytesOpen; } } e.Cancel = e.Control == null; break; } case "REDName": //Normal textbox is good for this. break; default: e.Cancel = true; break; } }