コード例 #1
0
ファイル: Rumble.cs プロジェクト: tateplayer/HydraX
            /// <summary>
            /// Exports the given asset from this pool
            /// </summary>
            public HydraStatus Export(GameAsset asset, HydraInstance instance)
            {
                var header = instance.Reader.ReadStruct <RumbleAsset>(asset.HeaderAddress);

                if (asset.Name != instance.Reader.ReadNullTerminatedString(header.NamePointer))
                {
                    return(HydraStatus.MemoryChanged);
                }

                var rumbleAsset = new GameDataTable.Asset(asset.Name, "rumble");

                rumbleAsset["broadcast"]           = header.Broadcast;
                rumbleAsset["camShakeDuration"]    = header.CamShakeDuration;
                rumbleAsset["camShakeRange"]       = header.CamShakeRange;
                rumbleAsset["camShakeScale"]       = header.CamShakeScale;
                rumbleAsset["duration"]            = header.Duration;
                rumbleAsset["fadeWithDistance"]    = header.FadeWithDistance;
                rumbleAsset["pulseBoneTagPointer"] = instance.Game.GetString(header.PulseBoneTagStringIndex, instance);
                rumbleAsset["pulseRadiusOuter"]    = header.PulseRadiusOuter;
                rumbleAsset["pulseScale"]          = header.PulseScale;
                rumbleAsset["range"]          = header.Range;
                rumbleAsset["lowrumblefile"]  = WriteRumbleFile(header.LowRumbleFilePointer, instance);
                rumbleAsset["highrumblefile"] = WriteRumbleFile(header.HighRumbleFilePointer, instance);

                instance.GDTs["Physic"][rumbleAsset.Name] = rumbleAsset;

                return(HydraStatus.Success);
            }
コード例 #2
0
ファイル: TagFX.cs プロジェクト: tateplayer/HydraX
            /// <summary>
            /// Exports the given asset from this pool
            /// </summary>
            public HydraStatus Export(GameAsset asset, HydraInstance instance)
            {
                var header = instance.Reader.ReadStruct <TagFXAsset>(asset.HeaderAddress);

                if (asset.Name != instance.Reader.ReadNullTerminatedString(header.NamePointer))
                {
                    return(HydraStatus.MemoryChanged);
                }

                var tagFXAsset = new GameDataTable.Asset(asset.Name, "tagfx");

                tagFXAsset["tagFXItemCount"] = header.ItemCount;

                var items = instance.Reader.ReadArray <TagFXItem>(header.ItemsPointer, header.ItemCount);

                for (int i = 0; i < items.Length; i++)
                {
                    tagFXAsset["bolted" + (i + 1).ToString()]    = items[i].Bolted;
                    tagFXAsset["fx" + (i + 1).ToString()]        = instance.Game.CleanAssetName(HydraAssetType.FX, instance.Game.GetAssetName(items[i].FXPointer, instance));
                    tagFXAsset["timeDelay" + (i + 1).ToString()] = items[i].Delay;
                    tagFXAsset["tag" + (i + 1).ToString()]       = instance.Game.GetString(items[i].TagNameIndex, instance);
                }

                instance.GDTs["Misc"][asset.Name] = tagFXAsset;

                return(HydraStatus.Success);
            }
コード例 #3
0
            /// <summary>
            /// Exports the given asset from this pool
            /// </summary>
            public HydraStatus Export(GameAsset asset, HydraInstance instance)
            {
                var header = instance.Reader.ReadStruct <AttachmentCosmeticVariantAsset>(asset.HeaderAddress);

                if (asset.Name != instance.Reader.ReadNullTerminatedString(header.NamePointer))
                {
                    return(HydraStatus.FailedToFindGame);
                }

                var result = new GameDataTable.Asset(asset.Name, "attachmentcosmeticvariant");

                var variants = instance.Reader.ReadArray <Variant>(header.VariantsPointer, header.VariantCount);

                for (int i = 0; i < variants.Length; i++)
                {
                    for (int j = 0; j < variants[i].VariantModels.Length; j++)
                    {
                        result[string.Format("acv{0}_{1}_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)]            = instance.Game.GetAssetName(variants[i].VariantModels[j].ModelPointer, instance);
                        result[string.Format("acv{0}_{1}ADS_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)]         = instance.Game.GetAssetName(variants[i].VariantModels[j].ADSModelPointer, instance);
                        result[string.Format("acv{0}_{1}Tag_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)]         = instance.Reader.ReadNullTerminatedString(variants[i].VariantModels[j].TagPointer);
                        result[string.Format("acv{0}_{1}OffsetX_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)]     = variants[i].VariantModels[j].Position.X;
                        result[string.Format("acv{0}_{1}OffsetY_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)]     = variants[i].VariantModels[j].Position.Y;
                        result[string.Format("acv{0}_{1}OffsetZ_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)]     = variants[i].VariantModels[j].Position.Z;
                        result[string.Format("acv{0}_{1}OffsetPitch_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)] = variants[i].VariantModels[j].Rotation.X;
                        result[string.Format("acv{0}_{1}OffsetYaw_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)]   = variants[i].VariantModels[j].Rotation.Y;
                        result[string.Format("acv{0}_{1}OffsetRoll_model{2}", i, ModelNames[j < 2 ? 0 : 1], j % 2)]  = variants[i].VariantModels[j].Rotation.Z;
                    }

                    result[string.Format("acv{0}_description", i)]      = instance.Reader.ReadNullTerminatedString(variants[i].DescriptionPointer);
                    result[string.Format("acv{0}_displayNameShort", i)] = instance.Reader.ReadNullTerminatedString(variants[i].ShortDisplayNamePointer);
                    result[string.Format("acv{0}_displayNameLong", i)]  = instance.Reader.ReadNullTerminatedString(variants[i].LongDisplayNamePointer);
                    result[string.Format("acv{0}_uiMaterial", i)]       = instance.Game.GetAssetName(variants[i].MaterialPointer, instance, 0xF8);
                }

                instance.GDTs["Weapon"][asset.Name] = result;

                // Done
                return(HydraStatus.Success);
            }
コード例 #4
0
            /// <summary>
            /// Exports the given asset from this pool
            /// </summary>
            public HydraStatus Export(GameAsset asset, HydraInstance instance)
            {
                var header = instance.Reader.ReadStruct <WeaponCamoAsset>(asset.HeaderAddress);

                if (asset.Name != instance.Reader.ReadNullTerminatedString(header.NamePointer))
                {
                    return(HydraStatus.MemoryChanged);
                }

                var weaponCamos          = instance.Reader.ReadArray <WeaponCamoEntry>(header.CamosPointer, header.CamoCount);
                var weaponCamoAssetNames = new string[10];
                var weaponCamoAssetCount = (int)Math.Ceiling(weaponCamos.Length / 75.0);

                for (int i = 0; i < weaponCamoAssetCount; i++)
                {
                    int camoCount = MathUtilities.Clamp(weaponCamos.Length - (i * 75), 75, 0);

                    int baseIndex = i * 75;

                    weaponCamoAssetNames[i] = string.Format("{0}{1}", asset.Name, i == 0 ? "_ship" : "_base" + (baseIndex + 1).ToString());

                    var weaponCamoAsset = new GameDataTable.Asset(weaponCamoAssetNames[i], "weaponcamo");

                    weaponCamoAsset.Properties["configstringFileType"] = "WEAPONCAMO";
                    weaponCamoAsset.Properties["baseIndex"]            = baseIndex + 1;
                    weaponCamoAsset.Properties["numCamos"]             = camoCount;

                    for (int j = 0; j < camoCount; j++)
                    {
                        var weaponCamoMaterial = weaponCamos[baseIndex + j];

                        var materials = instance.Reader.ReadArray <WeaponCamoMaterial>(weaponCamoMaterial.MaterialsCount == 0 ? 0 : weaponCamoMaterial.MaterialsPointer, weaponCamoMaterial.MaterialsCount == 0 ? 1 : weaponCamoMaterial.MaterialsCount);

                        for (int k = 0; k < materials.Length; k++)
                        {
                            var weaponCamoBaseMaterials = instance.Reader.ReadArray <WeaponCamoBaseMaterial>(materials[k].BaseMaterialsPointer, materials[k].BaseMaterialCount);

                            for (int l = 0; l < weaponCamoBaseMaterials.Length; l++)
                            {
                                weaponCamoAsset[string.Format("material{0}_{1}_base_material_{2}", k + 1, j + 1, l + 1)] = Path.GetFileNameWithoutExtension(instance.Game.GetAssetName(weaponCamoBaseMaterials[l].MaterialPointer, instance));
                                weaponCamoAsset[string.Format("material{0}_{1}_camo_mask_{2}", k + 1, j + 1, l + 1)]     = instance.Game.GetAssetName(weaponCamoBaseMaterials[l].CamoMaskPointer, instance, 0xF8);
                            }

                            weaponCamoAsset[string.Format("material{0}_{1}_detail_normal_height", k + 1, j + 1)]  = materials[k].NormalHeight;
                            weaponCamoAsset[string.Format("material{0}_{1}_detail_normal_map", k + 1, j + 1)]     = instance.Game.GetAssetName(materials[k].DetailNormalMapPointer, instance, 0xF8);
                            weaponCamoAsset[string.Format("material{0}_{1}_detail_normal_scale_x", k + 1, j + 1)] = materials[k].NormalScale.X;
                            weaponCamoAsset[string.Format("material{0}_{1}_detail_normal_scale_y", k + 1, j + 1)] = materials[k].NormalScale.Y;
                            weaponCamoAsset[string.Format("material{0}_{1}_gloss_blend", k + 1, j + 1)]           = materials[k].GlossMapBlend;
                            weaponCamoAsset[string.Format("material{0}_{1}_normal_amount", k + 1, j + 1)]         = materials[k].NormalBlend;
                            weaponCamoAsset[string.Format("material{0}_{1}_material", k + 1, j + 1)]         = Path.GetFileNameWithoutExtension(instance.Game.GetAssetName(materials[k].MaterialPointer, instance));
                            weaponCamoAsset[string.Format("material{0}_{1}_numBaseMaterials", k + 1, j + 1)] = materials[k].BaseMaterialCount;
                            weaponCamoAsset[string.Format("material{0}_{1}_rotation", k + 1, j + 1)]         = materials[k].Rotation;
                            weaponCamoAsset[string.Format("material{0}_{1}_scale_x", k + 1, j + 1)]          = materials[k].Scale.X;
                            weaponCamoAsset[string.Format("material{0}_{1}_scale_y", k + 1, j + 1)]          = materials[k].Scale.Y;
                            weaponCamoAsset[string.Format("material{0}_{1}_trans_x", k + 1, j + 1)]          = materials[k].Translation.X;
                            weaponCamoAsset[string.Format("material{0}_{1}_trans_y", k + 1, j + 1)]          = materials[k].Translation.Y;
                            weaponCamoAsset[string.Format("material{0}_{1}_useGlossMap", k + 1, j + 1)]      = materials[k].Flags.HasFlag(MaterialUsageFlags.GlossMap);
                            weaponCamoAsset[string.Format("material{0}_{1}_useNormalMap", k + 1, j + 1)]     = materials[k].Flags.HasFlag(MaterialUsageFlags.NormalMap);
                        }
                    }

                    instance.GDTs["Weapon"][weaponCamoAssetNames[i]] = weaponCamoAsset;
                }

                var weaponCamoTableAsset = new GameDataTable.Asset(asset.Name, "weaponcamotable");

                weaponCamoTableAsset["configstringFileType"] = "WEAPONCAMO";
                weaponCamoTableAsset["numCamoTables"]        = weaponCamoAssetNames.Count(x => x != null);


                for (int i = 0; i < weaponCamoAssetNames.Length; i++)
                {
                    weaponCamoTableAsset[string.Format("table_{0:D2}_name", i + 1)] = weaponCamoAssetNames[i];
                }

                instance.GDTs["Weapon"][asset.Name] = weaponCamoTableAsset;

                return(HydraStatus.Success);
            }
コード例 #5
0
ファイル: ZBarrier.cs プロジェクト: tateplayer/HydraX
            /// <summary>
            /// Exports the given asset from this pool
            /// </summary>
            public HydraStatus Export(GameAsset asset, HydraInstance instance)
            {
                var header = instance.Reader.ReadStruct <ZBarrierAsset>(asset.HeaderAddress);

                if (asset.Name != instance.Reader.ReadNullTerminatedString(header.NamePointer))
                {
                    return(HydraStatus.MemoryChanged);
                }

                var zbarrierAsset = new GameDataTable.Asset(asset.Name, "zbarrier");

                zbarrierAsset["generalRepairSound0"]             = GetAliasByHash(header.GeneralRepairSoundHash);
                zbarrierAsset["generalRepairSound1"]             = GetAliasByHash(header.SecondGeneralRepairSoundHash);
                zbarrierAsset["upgradedGeneralRepairSound0"]     = GetAliasByHash(header.UpgradedGeneralRepairSoundHash);
                zbarrierAsset["upgradedGeneralRepairSound1"]     = GetAliasByHash(header.SecondUpgradedGeneralRepairSoundHash);
                zbarrierAsset["useDelayBetweenGeneralRepSounds"] = header.DelayBetweenSounds.ToString();
                zbarrierAsset["delayBetweenGeneralRepSounds"]    = header.Delay.ToString();
                zbarrierAsset["earthquakeOnRepair"]    = header.EarthquakeOnRepair.ToString();
                zbarrierAsset["earthquakeMinScale"]    = header.EarthquakeMinScale.ToString();
                zbarrierAsset["earthquakeMaxScale"]    = header.EarthquakeMaxScale.ToString();
                zbarrierAsset["earthquakeMinDuration"] = header.EarthquakeMinDuration.ToString();
                zbarrierAsset["earthquakeMaxDuration"] = header.EarthquakeMaxDuration.ToString();
                zbarrierAsset["earthquakeRadius"]      = header.EarthquakeRadius.ToString();
                zbarrierAsset["autoHideOpenPieces"]    = header.AutoHideOpenPieces.ToString();
                zbarrierAsset["taunts"] = header.ZombiesTaunt.ToString();
                zbarrierAsset["reachThroughAttacks"]         = header.ZombiesReachThrough.ToString();
                zbarrierAsset["zombieTauntAnimState"]        = instance.Game.GetString(header.AnimStateStringIndex, instance);
                zbarrierAsset["zombieReachThroughAnimState"] = instance.Game.GetString(header.AnimSubStateStringIndex, instance);
                zbarrierAsset["numAttackSlots"]       = header.AttackSlotCount.ToString();
                zbarrierAsset["attackSpotHorzOffset"] = header.AttackHorizontalOffset.ToString();
                zbarrierAsset["collisionModel"]       = instance.Game.GetAssetName(header.CollisionModelPointer, instance);

                for (int i = 0; i < header.PieceCount; i++)
                {
                    // Add it to asset
                    zbarrierAsset[string.Format("boardModel{0}", i + 1)]                     = instance.Game.GetAssetName(header.Pieces[i].PieceModelPointer, instance);
                    zbarrierAsset[string.Format("upgradedBoardModel{0}", i + 1)]             = instance.Game.GetAssetName(header.Pieces[i].UpgradedPieceModelPointer, instance);
                    zbarrierAsset[string.Format("alternateBoardModel{0}", i + 1)]            = instance.Game.GetAssetName(header.Pieces[i].AlternatePieceModelPointer, instance);
                    zbarrierAsset[string.Format("boardAnim{0}", i + 1)]                      = instance.Reader.ReadNullTerminatedString(header.Pieces[i].ClosingAnimNamePointer);
                    zbarrierAsset[string.Format("tearAnim{0}", i + 1)]                       = instance.Reader.ReadNullTerminatedString(header.Pieces[i].OpeningAnimNamePointer);
                    zbarrierAsset[string.Format("boardRepairSound{0}", i + 1)]               = GetAliasByHash(header.Pieces[i].BoardClosingSoundHash);
                    zbarrierAsset[string.Format("boardRepairHoverSound{0}", i + 1)]          = GetAliasByHash(header.Pieces[i].BoardClosingHoverSoundHash);
                    zbarrierAsset[string.Format("repairFx{0}0", i + 1)]                      = instance.Game.CleanAssetName(HydraAssetType.FX, instance.Game.GetAssetName(header.Pieces[i].FirstClosingFXPointer, instance));
                    zbarrierAsset[string.Format("repairFx{0}1", i + 1)]                      = instance.Game.CleanAssetName(HydraAssetType.FX, instance.Game.GetAssetName(header.Pieces[i].SecondClosingFXPointer, instance));
                    zbarrierAsset[string.Format("OffsetRepairFxX{0}0", i + 1)]               = header.Pieces[i].FirstClosingFXOffset.X.ToString();
                    zbarrierAsset[string.Format("OffsetRepairFxY{0}0", i + 1)]               = header.Pieces[i].FirstClosingFXOffset.Y.ToString();
                    zbarrierAsset[string.Format("OffsetRepairFxZ{0}0", i + 1)]               = header.Pieces[i].FirstClosingFXOffset.Z.ToString();
                    zbarrierAsset[string.Format("OffsetRepairFxX{0}1", i + 1)]               = header.Pieces[i].SecondClosingFXOffset.X.ToString();
                    zbarrierAsset[string.Format("OffsetRepairFxY{0}1", i + 1)]               = header.Pieces[i].SecondClosingFXOffset.Y.ToString();
                    zbarrierAsset[string.Format("OffsetRepairFxZ{0}1", i + 1)]               = header.Pieces[i].SecondClosingFXOffset.Z.ToString();
                    zbarrierAsset[string.Format("zombieBoardTearAnimState{0}", i + 1)]       = instance.Game.GetString(header.Pieces[i].AnimStateStringIndex, instance);
                    zbarrierAsset[string.Format("zombieBoardTearAnimSubState{0}", i + 1)]    = instance.Game.GetString(header.Pieces[i].AnimSubStateStringIndex, instance);
                    zbarrierAsset[string.Format("pauseAndRepeatBoardRepairSound{0}", i + 1)] = header.Pieces[i].PauseAndRepeat.ToString();
                    zbarrierAsset[string.Format("pauseBetweenRepSoundsMin{0}", i + 1)]       = header.Pieces[i].MinPause.ToString();
                    zbarrierAsset[string.Format("pauseBetweenRepSoundsMax{0}", i + 1)]       = header.Pieces[i].MaxPause.ToString();
                    zbarrierAsset[string.Format("proBoardNumRepsToTear{0}", i + 1)]          = header.Pieces[i].LoopAnimRepsCount.ToString();
                }

                instance.GDTs["Misc"][asset.Name] = zbarrierAsset;

                return(HydraStatus.Success);
            }
コード例 #6
0
            /// <summary>
            /// Exports the given asset from this pool
            /// </summary>
            public HydraStatus Export(GameAsset asset, HydraInstance instance)
            {
                var header = instance.Reader.ReadStruct <XCamAsset>(asset.HeaderAddress);

                if (asset.Name != instance.Reader.ReadNullTerminatedString(header.NamePointer))
                {
                    return(HydraStatus.FailedToFindGame);
                }

                var path = Path.Combine(instance.ExportFolder, "xanim_export", "hydra_xcams", asset.Name + ".xcam_export");

                var gdtAsset = new GameDataTable.Asset(asset.Name, "xcam");

                gdtAsset["hide_hud"]                    = header.Flags[0];
                gdtAsset["is_looping"]                  = header.Flags[1];
                gdtAsset["hide_local_player"]           = header.Flags[2];
                gdtAsset["use_firstperson_player"]      = header.Flags[3];
                gdtAsset["disableNearDof"]              = header.Flags[4];
                gdtAsset["autoMotionBlur"]              = header.Flags[5];
                gdtAsset["easeAnimationsOut"]           = header.Flags[6];
                gdtAsset["rightStickRotateOffsetX"]     = header.RightStickRotationOffset.X;
                gdtAsset["rightStickRotateOffsetY"]     = header.RightStickRotationOffset.Y;
                gdtAsset["rightStickRotateOffsetZ"]     = header.RightStickRotationOffset.Z;
                gdtAsset["rightStickRotateMaxDegreesX"] = header.RightStickRotationDegrees.X;
                gdtAsset["rightStickRotateMaxDegreesY"] = header.RightStickRotationDegrees.Y;
                gdtAsset["parent_scene"]                = instance.Reader.ReadNullTerminatedString(header.ParentScenePointer);
                gdtAsset["filename"]                    = Path.Combine("hydra_xcams", asset.Name + ".xcam_export");

                instance.GDTs["XCams"][gdtAsset.Name] = gdtAsset;

                var xcam = new XCamObj
                {
                    Cameras        = new XCamObj.Camera[header.CameraCount],
                    Notetracks     = new XCamObj.Notetrack[header.NotetrackCount],
                    CameraSwitches = new XCamObj.CameraSwitch[header.CameraSwitchPointer > 0 ? header.FrameCount : 0]
                };

                var cameras = instance.Reader.ReadArray <XCamCamera>(header.CamerasPointer, header.CameraCount);

                for (int i = 0; i < cameras.Length; i++)
                {
                    xcam.Cameras[i] = new XCamObj.Camera
                    {
                        Farz       = cameras[i].FarZ,
                        Name       = instance.Game.GetString(cameras[i].NameStringIndex, instance),
                        Animations = new XCamObj.CameraAnimation[cameras[i].AnimationCount]
                    };

                    var animations = instance.Reader.ReadArray <XCamCameraAnimation>(cameras[i].AnimationsPointer, cameras[i].AnimationCount);

                    for (int j = 0; j < animations.Length; j++)
                    {
                        xcam.Cameras[i].Animations[j] = new XCamObj.CameraAnimation();

                        Matrix matrix = new Quaternion()
                        {
                            X = animations[i].Rotation.X,
                            Y = animations[i].Rotation.Y,
                            Z = animations[i].Rotation.Z,
                            W = animations[i].Rotation.W,
                        }.ToMatrix();

                        xcam.Cameras[i].Animations[j].Dir[0]      = matrix.X[0];
                        xcam.Cameras[i].Animations[j].Dir[1]      = matrix.Y[0];
                        xcam.Cameras[i].Animations[j].Dir[2]      = matrix.Z[0];
                        xcam.Cameras[i].Animations[j].Up[0]       = matrix.X[2];
                        xcam.Cameras[i].Animations[j].Up[1]       = matrix.Y[2];
                        xcam.Cameras[i].Animations[j].Up[2]       = matrix.Z[2];
                        xcam.Cameras[i].Animations[j].Right[0]    = matrix.X[1] * -1;
                        xcam.Cameras[i].Animations[j].Right[1]    = matrix.Y[1] * -1;
                        xcam.Cameras[i].Animations[j].Right[2]    = matrix.Z[1] * -1;
                        xcam.Cameras[i].Animations[j].Origin[0]   = animations[i].Origin.X;
                        xcam.Cameras[i].Animations[j].Origin[1]   = animations[i].Origin.Y;
                        xcam.Cameras[i].Animations[j].Origin[2]   = animations[i].Origin.Z;
                        xcam.Cameras[i].Animations[j].FieldOfView = animations[i].FieldofView;
                        xcam.Cameras[i].Animations[j].FocalLength = animations[i].FocalLength;
                        xcam.Cameras[i].Animations[j].FDist       = animations[i].FDist;
                        xcam.Cameras[i].Animations[j].FStop       = animations[i].FStop;
                        xcam.Cameras[i].Animations[j].Frame       = animations[i].Frame;

                        if (j == 0)
                        {
                            xcam.Cameras[i].Origin      = xcam.Cameras[i].Animations[j].Origin;
                            xcam.Cameras[i].Dir         = xcam.Cameras[i].Animations[j].Dir;
                            xcam.Cameras[i].Up          = xcam.Cameras[i].Animations[j].Up;
                            xcam.Cameras[i].Right       = xcam.Cameras[i].Animations[j].Right;
                            xcam.Cameras[i].FieldOfView = xcam.Cameras[i].Animations[j].FieldOfView;
                            xcam.Cameras[i].FocalLength = xcam.Cameras[i].Animations[j].FocalLength;
                            xcam.Cameras[i].FDist       = xcam.Cameras[i].Animations[j].FDist;
                            xcam.Cameras[i].FStop       = xcam.Cameras[i].Animations[j].FStop;
                        }
                    }
                }

                if (header.TargetModelRootBonePointer > 0)
                {
                    var rootBone = instance.Reader.ReadStruct <XCamTargetModelRootBone>(header.TargetModelRootBonePointer);

                    xcam.TargetModelBoneRoots = new XCamObj.TargetModelBoneRoot[1]
                    {
                        new XCamObj.TargetModelBoneRoot()
                        {
                            Name      = instance.Game.GetString(rootBone.NameStringIndex, instance),
                            Animation = new XCamObj.TargetModelBoneRootFrame[rootBone.AnimationCount]
                        }
                    };

                    var animations = instance.Reader.ReadArray <XCamTargetModelRootBoneAnimation>(rootBone.AnimationsPointer, rootBone.AnimationCount);

                    for (int i = 0; i < rootBone.AnimationCount; i++)
                    {
                        Matrix matrix = new Quaternion()
                        {
                            X = animations[i].Rotation.X,
                            Y = animations[i].Rotation.Y * -1,
                            Z = animations[i].Rotation.Z * -1,
                            W = animations[i].Rotation.W,
                        }.ToMatrix();

                        xcam.TargetModelBoneRoots[0].Animation[i]           = new XCamObj.TargetModelBoneRootFrame();
                        xcam.TargetModelBoneRoots[0].Animation[i].Offset[0] = animations[i].Origin.X;
                        xcam.TargetModelBoneRoots[0].Animation[i].Offset[1] = animations[i].Origin.Y * -1;
                        xcam.TargetModelBoneRoots[0].Animation[i].Offset[2] = animations[i].Origin.Z;
                        xcam.TargetModelBoneRoots[0].Animation[i].Axis["x"] = matrix.X;
                        xcam.TargetModelBoneRoots[0].Animation[i].Axis["y"] = matrix.Y;
                        xcam.TargetModelBoneRoots[0].Animation[i].Axis["z"] = matrix.Z;
                        xcam.TargetModelBoneRoots[0].Animation[i].Frame     = i;
                    }
                }

                var notetracks = instance.Reader.ReadArray <XCamNotetrack>(header.NotetracksPointer, header.NotetrackCount);

                for (int i = 0; i < notetracks.Length; i++)
                {
                    xcam.Notetracks[i] = new XCamObj.Notetrack(instance.Game.GetString(notetracks[i].NameStringIndex, instance), notetracks[i].Frame);
                }


                if (header.CameraSwitchPointer > 0)
                {
                    var switches = instance.Reader.ReadArray <XCamSwitch>(header.CameraSwitchPointer, header.FrameCount);

                    for (int i = 0; i < switches.Length; i++)
                    {
                        xcam.CameraSwitches[i] = new XCamObj.CameraSwitch()
                        {
                            Cameras = new int[2] {
                                switches[i].Camera1Index, switches[i].Camera2Index
                            },
                            Dissolve = switches[i].Dissolve,
                            Frame    = switches[i].Frame
                        };
                    }
                }

                xcam.Save(path);

                // Done
                return(HydraStatus.Success);
            }
コード例 #7
0
        public static Asset ConvertStructToGDTAsset(byte[] assetBuffer, Tuple <string, int, int>[] properties, HydraInstance instance, Func <byte[], int, int, HydraInstance, object> extendedDataHandler = null)
        {
            // Create new asset
            var asset = new GameDataTable.Asset();

            // Loop through potential properties
            foreach (var property in properties)
            {
                // Switch type
                switch (property.Item3)
                {
                // Strings (Enum that points to a string)
                case 0:
                {
                    asset[property.Item1] = instance.Reader.ReadNullTerminatedString(BitConverter.ToInt64(assetBuffer, property.Item2));
                    break;
                }

                // Inline Character Array?
                case 1:
                {
                    asset[property.Item1] = Encoding.ASCII.GetString(assetBuffer, property.Item2, 1024).TrimEnd('\0');
                    break;
                }

                // Inline Character Array?
                case 2:
                {
                    asset[property.Item1] = Encoding.ASCII.GetString(assetBuffer, property.Item2, 64).TrimEnd('\0');
                    break;
                }

                // Inline Character Array?
                case 3:
                {
                    asset[property.Item1] = Encoding.ASCII.GetString(assetBuffer, property.Item2, 256).TrimEnd('\0');
                    break;
                }

                // 32Bit Ints
                case 4:
                {
                    asset[property.Item1] = BitConverter.ToInt32(assetBuffer, property.Item2);
                    break;
                }

                /// Unknown
                case 5:
                {
                    asset[property.Item1] = BitConverter.ToInt32(assetBuffer, property.Item2);
                    break;
                }

                // Bools (8Bit)
                case 6:
                {
                    asset[property.Item1] = assetBuffer[property.Item2];
                    break;
                }

                // Bools (32bit)
                case 7:
                {
                    asset[property.Item1] = BitConverter.ToInt32(assetBuffer, property.Item2);
                    break;
                }

                // Floats
                case 8:
                {
                    asset[property.Item1] = BitConverter.ToSingle(assetBuffer, property.Item2);
                    break;
                }

                // Floats that get multiplied by 1000
                case 9:
                {
                    asset[property.Item1] = BitConverter.ToInt32(assetBuffer, property.Item2) / 1000.0;
                    break;
                }

                // Script Strings
                case 0x15:
                {
                    asset[property.Item1] = instance.Game.GetString(BitConverter.ToInt32(assetBuffer, property.Item2), instance);
                    break;
                }

                // Asset References
                case 0x28:
                {
                    // Pull from the weapon name rather than the asset name
                    asset[property.Item1] = instance.Game.GetAssetName(BitConverter.ToInt64(assetBuffer, property.Item2), instance, 8);
                    break;
                }

                case 0xA:
                case 0xB:
                case 0xD:
                case 0x10:
                case 0x1F:
                case 0x1B:
                case 0x1D:
                case 0x19:
                case 0x1A:
                case 0x26:
                case 0x27:
                case 0x2A:
                case 0x2C:
                case 0x2D:
                case 0x11:
                case 0x16:
                case 0x17:
                case 0x1E:
                case 0x2F:
                case 0x22:
                case 0x23:
                case 0x20:
                {
                    var assetName = instance.Game.GetAssetName(BitConverter.ToInt64(assetBuffer, property.Item2), instance, property.Item3 == 0x10 ? 0xF8 : 0);
                    if (property.Item3 == 0xA)
                    {
                        assetName = instance.Game.CleanAssetName(HydraAssetType.FX, assetName);
                    }
                    asset[property.Item1] = assetName;
                    break;
                }

                case 0x2B:
                case 0x2E:
                {
                    var assetName = instance.Game.GetAssetName(BitConverter.ToInt64(assetBuffer, property.Item2), instance, 0x1B0);
                    asset[property.Item1] = assetName;
                    break;
                }

                case 0x18:
                {
                    asset[property.Item1] = BlackOps3.GetAliasByHash(BitConverter.ToUInt32(assetBuffer, property.Item2));
                    break;
                }

                default:
                {
                    // Attempt to use the extended data handler, otherwise null
                    var result = extendedDataHandler?.Invoke(assetBuffer, property.Item2, property.Item3, instance);

                    if (result != null)
                    {
                        asset[property.Item1] = result;
                    }
                    else
                    {
                        asset[property.Item1] = "";
#if DEBUG
                        Console.WriteLine("Unknown Value: {0} - {1} - {2}", property.Item3, property.Item2, property.Item1);
#endif
                    }
                    // Done
                    break;
                }
                }
            }

            // Done
            return(asset);
        }
コード例 #8
0
            /// <summary>
            /// Exports the given asset from this pool
            /// </summary>
            public HydraStatus Export(GameAsset asset, HydraInstance instance)
            {
                var header = instance.Reader.ReadStruct <CustomizationTableAsset>(asset.HeaderAddress);

                if (asset.Name != instance.Reader.ReadNullTerminatedString(header.NamePointer))
                {
                    return(HydraStatus.MemoryChanged);
                }

                var customizationTable = new GameDataTable.Asset(asset.Name, "charactercustomizationtable");

                customizationTable["bodyTypeCount"] = header.BodyCount;
                customizationTable["headCount"]     = header.HeadCount;

                var playerHeads = instance.Reader.ReadArray <PlayerHeadAsset>(header.HeadsPointer, header.HeadCount);

                for (int i = 0; i < playerHeads.Length; i++)
                {
                    string name = instance.Reader.ReadNullTerminatedString(playerHeads[i].NamePointer);

                    var playerHead = new GameDataTable.Asset(name, "playerhead");

                    playerHead["displayName"] = instance.Reader.ReadNullTerminatedString(playerHeads[i].DisplayNamePointer);
                    playerHead["iconImage"]   = instance.Game.GetAssetName(playerHeads[i].IconPointer, instance, 0xF8);
                    playerHead["model"]       = instance.Game.GetAssetName(playerHeads[i].ModelPointer, instance);
                    playerHead["gender"]      = (int)playerHeads[i].Gender;

                    customizationTable["head" + (i + 1).ToString("00")] = playerHead.Name;

                    instance.GDTs["Character"][playerHead.Name] = playerHead;
                }

                var playerBodyTypes = instance.Reader.ReadArray <PlayerBodyTypeAsset>(header.BodiesPointer, header.BodyCount);

                for (int i = 0; i < playerBodyTypes.Length; i++)
                {
                    var playerBodyType = new GameDataTable.Asset(instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].NamePointer), "playerbodytype");

                    playerBodyType["abilityCardBackDesc"]    = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].AbilityCardBackDescPointer);
                    playerBodyType["abilityCardBackIcon"]    = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].AbilityCardBackIconPointer);
                    playerBodyType["abilityCardBackSubIcon"] = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].AbilityCardBackSubIconPointer);
                    playerBodyType["abilityIconEquipped"]    = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].AbilityIconEquippedPointer);
                    playerBodyType["abilityIconUnequipped"]  = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].AbilityIconUnequippedPointer);
                    playerBodyType["abilitySchema"]          = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].AbilitySchemaPointer);
                    playerBodyType["abilitySubItemDesc"]     = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].AbilitySubItemDescPointer);
                    playerBodyType["age"]        = playerBodyTypes[i].Age;
                    playerBodyType["background"] = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].BackgroundPointer);
                    playerBodyType["backgroundWithCharacter"] = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].BackgroundWithCharacterPointer);
                    playerBodyType["bio"] = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].BioPointer);
                    playerBodyType["bodySoundContext"]           = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].BodySoundContextPointer);
                    playerBodyType["bodyStyleCount"]             = playerBodyTypes[i].BodyStyleCount;
                    playerBodyType["cardBackIcon"]               = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].CardBackIconPointer);
                    playerBodyType["characterFootstepsNPCLoud"]  = instance.Game.GetAssetName(playerBodyTypes[i].CharacterFootstepsNPCLoudPointer, instance);
                    playerBodyType["characterFootstepsNPC"]      = instance.Game.GetAssetName(playerBodyTypes[i].CharacterFootstepsNPCPointer, instance);
                    playerBodyType["characterFootstepsNPCQuiet"] = instance.Game.GetAssetName(playerBodyTypes[i].CharacterFootstepsNPCQuietPointer, instance);
                    playerBodyType["characterFootsteps"]         = instance.Game.GetAssetName(playerBodyTypes[i].CharacterFootstepsPointer, instance);
                    playerBodyType["characterFootstepsQuiet"]    = instance.Game.GetAssetName(playerBodyTypes[i].CharacterFootstepsQuietPointer, instance);
                    playerBodyType["characterMovementFx"]        = instance.Game.GetAssetName(playerBodyTypes[i].CharacterMovementFxPointer, instance);
                    playerBodyType["characterMovementSounds"]    = instance.Game.GetAssetName(playerBodyTypes[i].CharacterMovementSoundsPointer, instance);
                    playerBodyType["defaultHeroRenderAbility"]   = instance.Game.GetAssetName(playerBodyTypes[i].DefaultHeroRenderAbilityPointer, instance, 0xF8);
                    playerBodyType["defaultHeroRender"]          = instance.Game.GetAssetName(playerBodyTypes[i].DefaultHeroRenderPointer, instance, 0xF8);
                    playerBodyType["description"]                 = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].DescriptionPointer);
                    playerBodyType["disabled"]                    = playerBodyTypes[i].Disabled;
                    playerBodyType["displayName"]                 = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].DisplayNamePointer);
                    playerBodyType["dogTagEnemy"]                 = instance.Game.GetAssetName(playerBodyTypes[i].DogTagEnemyPointer, instance);
                    playerBodyType["dogtagFriendly"]              = instance.Game.GetAssetName(playerBodyTypes[i].DogtagFriendlyPointer, instance);
                    playerBodyType["frontendVignetteStruct"]      = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].FrontendVignetteStructPointer);
                    playerBodyType["frontendVignetteWeaponModel"] = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].FrontendVignetteWeaponModelPointer);
                    playerBodyType["frontendVignetteXAnim"]       = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].FrontendVignetteXAnimPointer);
                    playerBodyType["frontendVignetteXCam"]        = instance.Game.GetAssetName(playerBodyTypes[i].FrontendVignetteXCamPointer, instance);
                    playerBodyType["frozenMomentOverlay"]         = instance.Game.GetAssetName(playerBodyTypes[i].FrozenMomentOverlayPointer, instance);
                    playerBodyType["frozenMomentRender"]          = instance.Game.GetAssetName(playerBodyTypes[i].FrozenMomentRenderPointer, instance);
                    playerBodyType["gender"]                = (int)playerBodyTypes[i].Gender;
                    playerBodyType["genderString"]          = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].GenderStringPointer);
                    playerBodyType["helmetStyleCount"]      = playerBodyTypes[i].HelmetStyleCount;
                    playerBodyType["heroAbility"]           = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].HeroAbilityPointer);
                    playerBodyType["heroWeapon"]            = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].HeroWeaponPointer);
                    playerBodyType["lockedImage"]           = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].LockedImagePointer);
                    playerBodyType["mpDialog"]              = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].MpDialogPointer);
                    playerBodyType["personalizeRender"]     = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].PersonalizeRenderPointer);
                    playerBodyType["realName"]              = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].RealNamePointer);
                    playerBodyType["rewardIcon"]            = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].RewardIconPointer);
                    playerBodyType["weaponCardBackDesc"]    = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].WeaponCardBackDescPointer);
                    playerBodyType["weaponCardBackIcon"]    = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].WeaponCardBackIconPointer);
                    playerBodyType["weaponCardBackSubIcon"] = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].WeaponCardBackSubIconPointer);
                    playerBodyType["weaponIconEquipped"]    = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].WeaponIconEquippedPointer);
                    playerBodyType["weaponIconUnequipped"]  = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].WeaponIconUnequippedPointer);
                    playerBodyType["weaponSchema"]          = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].WeaponSchemaPointer);
                    playerBodyType["weaponSubItemDesc"]     = instance.Reader.ReadNullTerminatedString(playerBodyTypes[i].WeaponSubItemDescPointer);
                    playerBodyType["zombiePlayerIcon"]      = instance.Game.GetAssetName(playerBodyTypes[i].ZombiePlayerIconPointer, instance, 0xF8);

                    var playerBodyStyles = instance.Reader.ReadArray <PlayerBodyStyleAsset>(playerBodyTypes[i].BodyStylesPointer, playerBodyTypes[i].BodyStyleCount);

                    for (int j = 0; j < playerBodyStyles.Length; j++)
                    {
                        var playerBodyStyle = new GameDataTable.Asset(instance.Reader.ReadNullTerminatedString(playerBodyStyles[j].NamePointer), "playerbodystyle");

                        playerBodyStyle["accentColorCount"]            = playerBodyStyles[j].AccentColorCount;
                        playerBodyStyle["characterMovementFxOverride"] = instance.Game.GetAssetName(playerBodyStyles[j].CharacterMovementFxOverridePointer, instance);
                        playerBodyStyle["displayName"] = instance.Reader.ReadNullTerminatedString(playerBodyStyles[j].DisplayNamePointer);
                        playerBodyStyle["firstPersonCinematicModel"] = instance.Game.GetAssetName(playerBodyStyles[j].FirstPersonCinematicModelPointer, instance);
                        playerBodyStyle["firstPersonLegsModel"]      = instance.Game.GetAssetName(playerBodyStyles[j].FirstPersonLegsModelPointer, instance);
                        playerBodyStyle["gibDef"]           = instance.Game.GetAssetName(playerBodyStyles[j].GibDefPointer, instance);
                        playerBodyStyle["gibLegsBoth"]      = instance.Game.GetAssetName(playerBodyStyles[j].GibLegsBothPointer, instance);
                        playerBodyStyle["gibLegsClean"]     = instance.Game.GetAssetName(playerBodyStyles[j].GibLegsCleanPointer, instance);
                        playerBodyStyle["gibLegsLeft"]      = instance.Game.GetAssetName(playerBodyStyles[j].GibLegsLeftPointer, instance);
                        playerBodyStyle["gibLegsRight"]     = instance.Game.GetAssetName(playerBodyStyles[j].GibLegsRightPointer, instance);
                        playerBodyStyle["gibTorsoClean"]    = instance.Game.GetAssetName(playerBodyStyles[j].GibTorsoCleanPointer, instance);
                        playerBodyStyle["gibTorsoLeft"]     = instance.Game.GetAssetName(playerBodyStyles[j].GibTorsoLeftPointer, instance);
                        playerBodyStyle["gibTorsoRight"]    = instance.Game.GetAssetName(playerBodyStyles[j].GibTorsoRightPointer, instance);
                        playerBodyStyle["iconImage"]        = instance.Game.GetAssetName(playerBodyStyles[j].IconImagePointer, instance, 0xF8);
                        playerBodyStyle["impactTypeCorpse"] = ImpactTypes[playerBodyStyles[j].ImpactTypeCorpse];
                        playerBodyStyle["impactType"]       = ImpactTypes[playerBodyStyles[j].ImpactType];
                        playerBodyStyle["viewArmsModel"]    = instance.Game.GetAssetName(playerBodyStyles[j].ViewArmsModelPointer, instance);
                        playerBodyStyle["xmodel"]           = instance.Game.GetAssetName(playerBodyStyles[j].XmodelPointer, instance);

                        var accents = instance.Reader.ReadArray <PlayerAccent>(playerBodyStyles[j].AccentsPointer, playerBodyStyles[j].AccentColorCount);

                        for (int k = 0; k < accents.Length; k++)
                        {
                            var accentOptions = instance.Reader.ReadArray <long>(accents[k].DataPointer, accents[k].DataCount);

                            playerBodyStyle[string.Format("accentColor{0}OptionsCount", k + 1)] = accents[k].DataCount;

                            for (int l = 0; l < accentOptions.Length; l++)
                            {
                                playerBodyStyle[string.Format("color_{0}_{1}", k + 1, l + 1)] = instance.Game.GetAssetName(accentOptions[l], instance);
                            }
                        }

                        playerBodyType["bodyStyle" + (j + 1).ToString("00")] = playerBodyStyle.Name;

                        instance.GDTs["Character"][playerBodyStyle.Name] = playerBodyStyle;
                    }

                    var playerHelmetStyles = instance.Reader.ReadArray <PlayerBodyStyleAsset>(playerBodyTypes[i].HelmetStylesPointer, playerBodyTypes[i].HelmetStyleCount);

                    for (int j = 0; j < playerHelmetStyles.Length; j++)
                    {
                        var playerHelmetStyle = new GameDataTable.Asset(instance.Reader.ReadNullTerminatedString(playerHelmetStyles[j].NamePointer), "playerhelmetstyle");

                        playerHelmetStyle["accentColorCount"] = playerHelmetStyles[j].AccentColorCount;
                        playerHelmetStyle["displayName"]      = instance.Reader.ReadNullTerminatedString(playerHelmetStyles[j].DisplayNamePointer);
                        playerHelmetStyle["iconImage"]        = instance.Game.GetAssetName(playerHelmetStyles[j].IconImagePointer, instance, 0xF8);
                        playerHelmetStyle["impactTypeCorpse"] = ImpactTypes[playerHelmetStyles[j].ImpactTypeCorpse];
                        playerHelmetStyle["impactType"]       = ImpactTypes[playerHelmetStyles[j].ImpactType];
                        playerHelmetStyle["xmodel"]           = instance.Game.GetAssetName(playerHelmetStyles[j].XmodelPointer, instance);

                        var accents = instance.Reader.ReadArray <PlayerAccent>(playerHelmetStyles[j].AccentsPointer, playerHelmetStyles[j].AccentColorCount);

                        for (int k = 0; k < accents.Length; k++)
                        {
                            var accentOptions = instance.Reader.ReadArray <long>(accents[k].DataPointer, accents[k].DataCount);

                            playerHelmetStyle[string.Format("accentColor{0}OptionsCount", k + 1)] = accents[k].DataCount;

                            for (int l = 0; l < accentOptions.Length; l++)
                            {
                                playerHelmetStyle[string.Format("color_{0}_{1}", k + 1, l + 1)] = instance.Game.GetAssetName(accentOptions[l], instance);
                            }
                        }

                        playerBodyType["helmetStyle" + (j + 1).ToString("00")] = playerHelmetStyle.Name;

                        instance.GDTs["Character"][playerHelmetStyle.Name] = playerHelmetStyle;
                    }

                    var dataBlocks = instance.Reader.ReadArray <KVPBlock>(playerBodyTypes[i].DataBlocksPointer, playerBodyTypes[i].DataBlockCount);

                    for (int j = 0; j < dataBlocks.Length; j++)
                    {
                        // Determine type if we're int, since bool and int share same, but the pointer value will be different? (only 2 are bool anyway but just in case)
                        var dataType = dataBlocks[i].DataType;

                        if (dataType == DataTypes.Int && (dataBlocks[i].DataPointer & 0xFFFFFFFF) != dataBlocks[i].Data)
                        {
                            dataType = DataTypes.Bool;
                        }

                        string propertyName = string.Format("{0}_{1}", dataType.ToString().ToLower(), instance.Game.GetString(dataBlocks[i].DataNameStringIndex, instance));

                        playerBodyType[propertyName] = dataBlocks[i].DataType == DataTypes.Int ? dataBlocks[i].Data.ToString() : instance.Game.GetString(dataBlocks[i].DataStringIndex, instance);
                    }

                    customizationTable["bodyType" + (i + 1).ToString("00")] = playerBodyType.Name;

                    instance.GDTs["Character"][playerBodyType.Name] = playerBodyType;
                }

                instance.GDTs["Character"][customizationTable.Name] = customizationTable;

                return(HydraStatus.Success);
            }
コード例 #9
0
            /// <summary>
            /// Exports the given asset from this pool
            /// </summary>
            public HydraStatus Export(GameAsset asset, HydraInstance instance)
            {
                var header = instance.Reader.ReadStruct <MaterialAsset>(asset.HeaderAddress);

                if (asset.Name != Path.GetFileNameWithoutExtension(instance.Reader.ReadNullTerminatedString(header.NamePointer).Split('|')[0]))
                {
                    return(HydraStatus.MemoryChanged);
                }

                // We need the techset for buffer info
                var techset = instance.Reader.ReadStruct <MaterialTechniqueSet>(header.TechniquePointer);
                var mtlType = Path.GetFileNameWithoutExtension(instance.Reader.ReadNullTerminatedString(instance.Reader.ReadInt64(header.TechniquePointer)).Split('#')[0]);



                if (!instance.TechniqueSetCache.TryGetValue(mtlType, out var set))
                {
                    throw new ArgumentException("Unknown material type.", mtlType);
                }

                // Add base stuffs
                // Create asset
                var gdtAsset = new GameDataTable.Asset(asset.Name, "material");

                // Set Default Properties
                gdtAsset.Properties.Add("surfaceType", SurfaceTypes.TryGetValue(BitConverter.ToUInt32(header.FlagsAndSettings, 28), out var surfaceType) ? surfaceType : "<none>");
                gdtAsset.Properties.Add("template", "material.template");
                gdtAsset.Properties.Add("materialCategory", set.Category);
                gdtAsset.Properties.Add("materialType", mtlType);
                gdtAsset.Properties.Add("textureAtlasRowCount", header.FlagsAndSettings[6].ToString());
                gdtAsset.Properties.Add("textureAtlasColumnCount", header.FlagsAndSettings[7].ToString());
                gdtAsset.Properties.Add("usage", "<not in editor>");

                for (int i = 0; i < header.SettingsPointers.Length; i++)
                {
                    if (header.SettingsPointers[i].SettingsPointer == 0)
                    {
                        continue;
                    }

                    var technique = instance.Reader.ReadStruct <MaterialTechnique>(techset.TechniquePointers[i]);
                    var pass      = instance.Reader.ReadStruct <MaterialTechniquePass>(technique.PassPointer);
                    var settings  = ParseDXBC(instance.Reader.ReadBytes(pass.ShaderPointer, pass.ShaderSize));

                    if (settings == null)
                    {
                        throw new ArgumentException("Failed to find $Globals in DirectX Byte Code RDEF part", "settings");
                    }

                    var settingsInfo   = instance.Reader.ReadStruct <MaterialSettingBuffer>(header.SettingsPointers[i].SettingsPointer);
                    var settingsBuffer = instance.Reader.ReadBytes(settingsInfo.BufferPointer, (int)settingsInfo.Size);

                    foreach (var setting in settings)
                    {
                        if (set.Settings.TryGetValue(setting.Key, out var gdtInfo))
                        {
                            switch (gdtInfo.DataType)
                            {
                            case SettingDataType.Boolean:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = (int)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.UInt1:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.UInt2:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[1]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 04), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.UInt3:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[1]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 04), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[2]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 08), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.UInt4:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[1]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 04), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[2]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 08), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[3]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = (uint)PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 12), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.Float1:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.Float2:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[1]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 04), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.Float3:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[1]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 04), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[2]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 08), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.Float4:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[1]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 04), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[2]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 08), gdtInfo.PostProcessor);
                                }
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[3]))
                                {
                                    gdtAsset[gdtInfo.GDTSlotNames[1]] = PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 12), gdtInfo.PostProcessor);
                                }
                                break;
                            }

                            case SettingDataType.Color:
                            {
                                if (!gdtAsset.Properties.ContainsKey(gdtInfo.GDTSlotNames[0]))
                                {
                                    var r = MathUtilities.Clamp(PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 00), gdtInfo.PostProcessor), 1.0, 0.0);
                                    var g = MathUtilities.Clamp(PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 04), gdtInfo.PostProcessor), 1.0, 0.0);
                                    var b = MathUtilities.Clamp(PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 08), gdtInfo.PostProcessor), 1.0, 0.0);
                                    var a = MathUtilities.Clamp(PerformPostProcess(BitConverter.ToSingle(settingsBuffer, setting.Value + 12), gdtInfo.PostProcessor), 1.0, 0.0);

                                    gdtAsset[gdtInfo.GDTSlotNames[0]] = string.Format("{0:0.000000} {1:0.000000} {2:0.000000} {3:0.000000}", r, g, b, a);
                                }
                                break;
                            }
                            }
                        }
                    }
                }


                for (int j = 0; j < header.Counts[0]; j++)
                {
                    var materialImage = instance.Reader.ReadStruct <MaterialImage>(header.ImageTablePointer + (j * 0x20));

                    if (set.ImageSlots.TryGetValue(materialImage.SemanticHash, out string slot))
                    {
                        gdtAsset.Properties[slot] = instance.Reader.ReadNullTerminatedString(instance.Reader.ReadInt64(materialImage.ImagePointer + 0xF8));
                    }
                }

                instance.GDTs["Misc"][asset.Name] = gdtAsset;

                return(HydraStatus.Success);
            }