public static GetPropertyInfo ( MEGame game, string propname, string typeName ) : |
||
game | MEGame | |
propname | string | |
typeName | string | |
리턴 |
static UProperty ReadSpecialStructProp(IMEPackage pcc, MemoryStream stream, UProperty template, string structType) { if (stream.Position + 1 >= stream.Length) { throw new EndOfStreamException("tried to read past bounds of Export Data"); } switch (template.PropType) { case PropertyType.FloatProperty: return(new FloatProperty(stream, template.Name)); case PropertyType.IntProperty: return(new IntProperty(stream, template.Name)); case PropertyType.ObjectProperty: return(new ObjectProperty(stream, template.Name)); case PropertyType.StringRefProperty: return(new StringRefProperty(stream, template.Name)); case PropertyType.NameProperty: return(new NameProperty(stream, pcc, template.Name)); case PropertyType.BoolProperty: return(new BoolProperty(stream, pcc.Game, template.Name)); case PropertyType.ByteProperty: if (template is EnumProperty) { string enumType = UnrealObjectInfo.GetEnumType(pcc.Game, template.Name, structType); return(new EnumProperty(stream, pcc, enumType, template.Name)); } return(new ByteProperty(stream, template.Name)); case PropertyType.BioMask4Property: return(new BioMask4Property(stream, template.Name)); case PropertyType.StrProperty: return(new StrProperty(stream, template.Name)); case PropertyType.ArrayProperty: return(ReadArrayProperty(stream, pcc, structType, template.Name, true)); case PropertyType.StructProperty: PropertyCollection structProps = ReadSpecialStruct(pcc, stream, UnrealObjectInfo.GetPropertyInfo(pcc.Game, template.Name, structType).reference, 0); return(new StructProperty(structType, structProps, template.Name, true)); case PropertyType.None: return(new NoneProperty(template.Name)); case PropertyType.DelegateProperty: throw new NotImplementedException("cannot read Delegate property of Immutable struct"); case PropertyType.Unknown: throw new NotImplementedException("cannot read Unknown property of Immutable struct"); } throw new NotImplementedException("cannot read Unknown property of Immutable struct"); }
public static UProperty ReadArrayProperty(MemoryStream stream, IMEPackage pcc, string enclosingType, NameReference name, bool IsInImmutable = false) { long arrayOffset = IsInImmutable ? stream.Position : stream.Position - 24; ArrayType arrayType = UnrealObjectInfo.GetArrayType(pcc.Game, name, enclosingType); int count = stream.ReadValueS32(); switch (arrayType) { case ArrayType.Object: { var props = new List <ObjectProperty>(); for (int i = 0; i < count; i++) { props.Add(new ObjectProperty(stream)); } return(new ArrayProperty <ObjectProperty>(arrayOffset, props, arrayType, name)); } case ArrayType.Name: { var props = new List <NameProperty>(); for (int i = 0; i < count; i++) { props.Add(new NameProperty(stream, pcc)); } return(new ArrayProperty <NameProperty>(arrayOffset, props, arrayType, name)); } case ArrayType.Enum: { var props = new List <EnumProperty>(); NameReference enumType = new NameReference { Name = UnrealObjectInfo.GetEnumType(pcc.Game, name, enclosingType) }; for (int i = 0; i < count; i++) { props.Add(new EnumProperty(stream, pcc, enumType)); } return(new ArrayProperty <EnumProperty>(arrayOffset, props, arrayType, name)); } case ArrayType.Struct: { var props = new List <StructProperty>(); string arrayStructType = UnrealObjectInfo.GetPropertyInfo(pcc.Game, name, enclosingType)?.reference; if (IsInImmutable || ME3UnrealObjectInfo.isImmutable(arrayStructType)) { int arraySize = 0; if (!IsInImmutable) { stream.Seek(-16, SeekOrigin.Current); arraySize = stream.ReadValueS32(); stream.Seek(12, SeekOrigin.Current); } for (int i = 0; i < count; i++) { long offset = stream.Position; PropertyCollection structProps = ReadSpecialStruct(pcc, stream, arrayStructType, arraySize / count); StructProperty structP = new StructProperty(arrayStructType, structProps, isImmutable: true); structP.Offset = offset; props.Add(structP); } } else { for (int i = 0; i < count; i++) { long structOffset = stream.Position; PropertyCollection structProps = ReadProps(pcc, stream, arrayStructType); StructProperty structP = new StructProperty(arrayStructType, structProps); structP.Offset = structOffset; props.Add(structP); } } return(new ArrayProperty <StructProperty>(arrayOffset, props, arrayType, name)); } case ArrayType.Bool: { var props = new List <BoolProperty>(); for (int i = 0; i < count; i++) { props.Add(new BoolProperty(stream, pcc.Game)); } return(new ArrayProperty <BoolProperty>(arrayOffset, props, arrayType, name)); } case ArrayType.String: { var props = new List <StrProperty>(); for (int i = 0; i < count; i++) { props.Add(new StrProperty(stream)); } return(new ArrayProperty <StrProperty>(arrayOffset, props, arrayType, name)); } case ArrayType.Float: { var props = new List <FloatProperty>(); for (int i = 0; i < count; i++) { props.Add(new FloatProperty(stream)); } return(new ArrayProperty <FloatProperty>(arrayOffset, props, arrayType, name)); } case ArrayType.Byte: { var props = new List <ByteProperty>(); for (int i = 0; i < count; i++) { props.Add(new ByteProperty(stream)); } return(new ArrayProperty <ByteProperty>(arrayOffset, props, arrayType, name)); } case ArrayType.Int: default: { var props = new List <IntProperty>(); for (int i = 0; i < count; i++) { props.Add(new IntProperty(stream)); } return(new ArrayProperty <IntProperty>(arrayOffset, props, arrayType, name)); } } }