예제 #1
0
        public static void LoadFromVPK(string vpkPath)
        {
            if (!Directory.Exists("cache"))
            {
                Directory.CreateDirectory("cache");
            }

            string path = Properties.Settings.Default.DotaDir + Path.DirectorySeparatorChar + VPKPath;

            HLLib.hlInitialize();

            // Get the package type from the filename extension.
            HLLib.HLPackageType PackageType = HLLib.hlGetPackageTypeFromName(path);

            HLLib.HLFileMode OpenMode = HLLib.HLFileMode.HL_MODE_READ |
                                        //HLLib.HLFileMode.HL_MODE_QUICK_FILEMAPPING |
                                        HLLib.HLFileMode.HL_MODE_VOLATILE;

            uint PackageID;

            ErrorCheck(HLLib.hlCreatePackage(PackageType, out PackageID));

            ErrorCheck(HLLib.hlBindPackage(PackageID));

            ErrorCheck(HLLib.hlPackageOpenFile(path, (uint)OpenMode));
        }
예제 #2
0
        public static void ReadScriptFromVPK <T>(string filePath, List <T> ListToInsert) where T : DotaDataObject
        {
            IntPtr root = HLLib.hlPackageGetRoot();

            IntPtr file = HLLib.hlFolderGetItemByPath(root, filePath, HLLib.HLFindType.HL_FIND_FILES);

            IntPtr stream;

            ErrorCheck(HLLib.hlPackageCreateStream(file, out stream));

            string unitsText = ReadTextFromHLLibStream(stream);

            KeyValue rootkv = KVLib.KVParser.KV1.Parse(unitsText);

            foreach (KeyValue kv in rootkv.Children)
            {
                if (!kv.HasChildren)
                {
                    continue;                  //Get rid of that pesky "Version" "1" key
                }
                T unit = typeof(T).GetConstructor(new Type[] { typeof(KeyValue) }).Invoke(new object[] { kv }) as T;

                unit.ObjectInfo.FromVPK         = true;
                unit.ObjectInfo.ObjectClass     = DotaDataObject.DataObjectInfo.ObjectDataClass.Default;
                unit.ObjectInfo.OriginatingFile = filePath;

                ListToInsert.Add(unit);
            }
            return;
        }
예제 #3
0
 protected override void Dispose(bool disposing)
 {
     base.Dispose(disposing);
     if (!_disposed)
     {
         HLLib.hlStreamClose(_streamPtr);
     }
 }
예제 #4
0
        protected void PopulateFromVPK()
        {
            TreeNode rootNode = treeView1.Nodes["vpk"];

            rootNode.Tag  = "/";
            rootNode.Text = "Dota 2 VPK";
            rootNode.Nodes.Clear();
            IntPtr rootptr = HLLib.hlPackageGetRoot();

            RecursivePopulateFromVPK(ref rootNode, rootptr);

            rootNode.Expand();
        }
예제 #5
0
        public PackageFileStream(IntPtr filePtr)
        {
            _filePtr = filePtr;
            if (!HLLib.hlFileCreateStream(filePtr, out _streamPtr))
            {
                throw new Exception("Unable to create stream.");
            }

            if (!HLLib.hlStreamOpen(_streamPtr, (uint)HLLib.HLFileMode.HL_MODE_READ))
            {
                throw new Exception("Unable to open stream.");
            }
            _size = (long)HLLib.hlStreamGetStreamSizeEx(_streamPtr);
        }
예제 #6
0
        public static string ReadAllText(string filePath)
        {
            IntPtr root = HLLib.hlPackageGetRoot();

            IntPtr file = HLLib.hlFolderGetItemByPath(root, filePath, HLLib.HLFindType.HL_FIND_FILES);

            IntPtr stream;

            ErrorCheck(HLLib.hlPackageCreateStream(file, out stream));

            string text = ReadTextFromHLLibStream(stream);

            return(text);
        }
예제 #7
0
        public void RecursiveBuildFromVPK(ref ProjectFolder folder, IntPtr currentFolder)
        {
            uint folderCount = HLLib.hlFolderGetCount(currentFolder);

            for (uint i = 0; i < folderCount; i++)
            {
                IntPtr subItem = HLLib.hlFolderGetItem(currentFolder, i);
                string name    = HLLib.hlItemGetName(subItem);

                if (HLLib.hlItemGetType(subItem) == HLLib.HLDirectoryItemType.HL_ITEM_FOLDER)
                {
                    DomNode sf = new DomNode(DotaObjectsSchema.FolderType.Type);

                    sf.SetAttribute(DotaObjectsSchema.FolderType.NameAttribute, name);
                    sf.SetAttribute(DotaObjectsSchema.FolderType.PathAttribute, folder.Path + "/" + name);
                    sf.SetAttribute(DotaObjectsSchema.FolderType.InGCFAttribute, true);

                    DomNode par = folder.As <DomNode>();
                    par.GetChildList(DotaObjectsSchema.FolderType.FilesChild).Add(sf);


                    ProjectFolder subFolder = sf.As <ProjectFolder>();

                    RecursiveBuildFromVPK(ref subFolder, subItem);
                }
                if (HLLib.hlItemGetType(subItem) == HLLib.HLDirectoryItemType.HL_ITEM_FILE)
                {
                    string ext = name.Substring(name.LastIndexOf('.'));

                    ProjectFile f;
                    if (ProjectLoader.FileTypes.ContainsKey(ext))
                    {
                        ProjectLoader.FileTypeResolver resolver = ProjectLoader.FileTypes[ext];
                        f = (ProjectFile)(new DomNode(resolver.DomNodeType)).As(resolver.WrapperType);
                    }
                    else
                    {
                        f = (new DomNode(DotaObjectsSchema.FileType.Type)).As <ProjectFile>();
                    }

                    f.Name  = name;
                    f.Path  = folder.Path + "/" + name;
                    f.InGCF = true;

                    folder.Files.Add(f);
                }
            }
        }
예제 #8
0
        public ProjectFolder BuildDotaVPKNode()
        {
            ProjectFolder folder = (new DomNode(DotaObjectsSchema.FolderType.Type)).As <ProjectFolder>();

            folder.Name  = "root";
            folder.Path  = "root";
            folder.InGCF = true;

            IntPtr root = HLLib.hlPackageGetRoot();

            RecursiveBuildFromVPK(ref folder, root);

            folder.As <DomNode>().InitializeExtensions();

            return(folder);
        }
예제 #9
0
        public PackageSystem(List <string> packages)
        {
            _rootNode = new PackageNode()
            {
                Name = "root", Directory = true
            };

            HLLib.hlInitialize();

            foreach (var package in packages)
            {
                if (Directory.Exists(package))
                {
                    FindDirFiles(package, _rootNode);
                    continue;
                }

                HLLib.HLPackageType type = HLLib.hlGetPackageTypeFromName(package);

                uint packagePointer;
                if (!HLLib.hlCreatePackage(type, out packagePointer))
                {
                    throw new Exception("Can't load package: " + HLLib.hlGetString(HLLib.HLOption.HL_ERROR_SHORT_FORMATED));
                }

                HLLib.hlBindPackage(packagePointer);

                if (!HLLib.hlPackageOpenFile(package, (uint)HLLib.HLFileMode.HL_MODE_READ))
                {
                    throw new Exception("Can't load package: " + HLLib.hlGetString(HLLib.HLOption.HL_ERROR_SHORT_FORMATED));
                }

                _rootNode.FileSize = 0;
                var rootItems = HLLib.hlFolderGetCount(HLLib.hlPackageGetRoot());
                for (uint i = 0; i < rootItems; i++)
                {
                    var  item = HLLib.hlFolderGetItem(HLLib.hlPackageGetRoot(), i);
                    uint size;
                    HLLib.hlItemGetSize(item, out size);
                    _rootNode.FileSize += size;
                }
                FindFiles(HLLib.hlPackageGetRoot(), _rootNode, packagePointer);

                //HLLib.hlPackageClose();
            }
        }
예제 #10
0
        public string ReadTextFromVPK(string path)
        {
            IntPtr root = HLLib.hlPackageGetRoot();

            IntPtr file = HLLib.hlFolderGetItemByPath(root, path, HLLib.HLFindType.HL_FIND_FILES);

            IntPtr stream;

            if (ErrorCheck(HLLib.hlPackageCreateStream(file, out stream)))
            {
                return("Unable to Load File".Localize());
            }

            string text = ReadTextFromHLLibStream(stream);

            return(text);
        }
예제 #11
0
        private static string ReadTextFromHLLibStream(IntPtr Stream)
        {
            HLLib.HLFileMode mode = HLLib.HLFileMode.HL_MODE_READ;

            ErrorCheck(HLLib.hlStreamOpen(Stream, (uint)mode));

            StringBuilder str = new StringBuilder();

            char ch;

            while (HLLib.hlStreamReadChar(Stream, out ch))
            {
                str.Append(ch);
            }

            HLLib.hlStreamClose(Stream);

            return(str.ToString());
        }
예제 #12
0
        private void FindFiles(IntPtr dir, PackageNode node, uint package)
        {
            uint count = HLLib.hlFolderGetCount(dir);

            for (uint i = 0; i < count; i++)
            {
                var item     = HLLib.hlFolderGetItem(dir, i);
                var itemNode = new PackageNode();
                itemNode.Name      = HLLib.hlItemGetName(item).ToLower();
                itemNode.Directory = HLLib.hlItemGetType(item) == HLLib.HLDirectoryItemType.HL_ITEM_FOLDER;

                var pathPtr = Marshal.AllocHGlobal(255);
                HLLib.hlItemGetPath(item, pathPtr, 255);
                var pathBuffer = new byte[255];
                Marshal.Copy(pathPtr, pathBuffer, 0, 255);
                itemNode.Path = Encoding.ASCII.GetString(pathBuffer).TrimEnd('\0').ToLower();

                uint filesize;
                HLLib.hlItemGetSize(item, out filesize);
                itemNode.FileSize = filesize;

                if (itemNode.Directory)
                {
                    if (node.Directories.ContainsKey(itemNode.Name))
                    {
                        FindFiles(item, node.Directories[itemNode.Name], package);
                    }
                    else
                    {
                        FindFiles(item, itemNode, package);
                        node.Directories[itemNode.Name] = itemNode;
                    }
                }
                else
                {
                    itemNode.FilePtr          = item;
                    itemNode.FilePackage      = package;
                    node.Files[itemNode.Name] = itemNode;
                }
            }
        }
예제 #13
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            IntPtr dataPtr = Marshal.AllocHGlobal((int)(_size > count ? count : _size));

            HLLib.hlStreamRead(_streamPtr, dataPtr, (uint)(_size > count ? count : _size));

            unsafe
            {
                var source = (byte *)dataPtr;
                fixed(byte *dest = buffer)
                {
                    for (int i = offset; i < (_size - offset > count ? count : _size - offset); i++)
                    {
                        dest[i] = source[i];
                    }
                }
            }

            Marshal.FreeHGlobal(dataPtr);
            return((int)(_size - offset > count ? count : _size - offset));
        }
예제 #14
0
        public static void OpenVPK()
        {
            string path = GlobalSettings.DotaDirectory + Path.DirectorySeparatorChar + VPKPath;

            HLLib.hlInitialize();

            // Get the package type from the filename extension.
            HLLib.HLPackageType PackageType = HLLib.hlGetPackageTypeFromName(path);

            HLLib.HLFileMode OpenMode = HLLib.HLFileMode.HL_MODE_READ |
                                        //HLLib.HLFileMode.HL_MODE_QUICK_FILEMAPPING |
                                        HLLib.HLFileMode.HL_MODE_VOLATILE;

            uint PackageID;

            ErrorCheck(HLLib.hlCreatePackage(PackageType, out PackageID));

            ErrorCheck(HLLib.hlBindPackage(PackageID));

            ErrorCheck(HLLib.hlPackageOpenFile(path, (uint)OpenMode));
        }
예제 #15
0
        public override long Seek(long offset, SeekOrigin origin)
        {
            var seekMode = HLLib.HLSeekMode.HL_SEEK_BEGINNING;

            if (origin == SeekOrigin.Current)
            {
                seekMode  = HLLib.HLSeekMode.HL_SEEK_CURRENT;
                _position = _position + offset;
            }
            else if (origin == SeekOrigin.End)
            {
                seekMode  = HLLib.HLSeekMode.HL_SEEK_END;
                _position = _position - offset;
            }
            else
            {
                _position = offset;
            }

            return((long)HLLib.hlStreamSeekEx(_streamPtr, offset, seekMode));
        }
예제 #16
0
        protected void RecursivePopulateFromVPK(ref TreeNode parent, IntPtr CurrentFolder)
        {
            uint folderCount = HLLib.hlFolderGetCount(CurrentFolder);

            for (uint i = 0; i < folderCount; i++)
            {
                IntPtr subItem = HLLib.hlFolderGetItem(CurrentFolder, i);
                string name    = HLLib.hlItemGetName(subItem);

                if (HLLib.hlItemGetType(subItem) == HLLib.HLDirectoryItemType.HL_ITEM_FOLDER)
                {
                    TreeNode folder = new TreeNode()
                    {
                        Name               = name,
                        Text               = name,
                        ImageIndex         = 2,
                        SelectedImageIndex = 2,
                        Tag         = ((string)parent.Tag) + name + "/",
                        ContextMenu = folder_context_menu,
                    };

                    parent.Nodes.Add(folder);

                    RecursivePopulateFromVPK(ref folder, subItem);
                }
                else if (HLLib.hlItemGetType(subItem) == HLLib.HLDirectoryItemType.HL_ITEM_FILE)
                {
                    TreeNode folder = new TreeNode()
                    {
                        Name        = name,
                        Text        = name,
                        ImageIndex  = 0,
                        Tag         = ((string)parent.Tag) + name,
                        ContextMenu = file_context_menu,
                    };

                    parent.Nodes.Add(folder);
                }
            }
        }
예제 #17
0
파일: Program.cs 프로젝트: jpiolho/sledge
 static string GetValidation(HLLib.HLValidation eValidation)
 {
     if(eValidation >= HLLib.HLValidation.HL_VALIDATES_OK && eValidation <= HLLib.HLValidation.HL_VALIDATES_ERROR)
     {
         return ValidationNames[(uint)eValidation];
     }
     return string.Empty;
 }
예제 #18
0
        private void btnNext_Click(object sender, EventArgs e)
        {
            if (radioGcf.Checked) //Extract from gcf
            {
                Cursor = Cursors.WaitCursor;
                Settings.Default.OpenFileSetting = 0;
                HLLib.hlInitialize();
                HLLib.HLPackageType ePackageType = HLLib.HLPackageType.HL_PACKAGE_GCF;
                uint uiMode = (uint)HLLib.HLFileMode.HL_MODE_READ | (uint)HLLib.HLFileMode.HL_MODE_VOLATILE;
                uint uiPackage;
                HLLib.hlCreatePackage(ePackageType, out uiPackage);
                HLLib.hlBindPackage(uiPackage);
                if (String.IsNullOrEmpty(Settings.Default.SteamFolder))
                {
showDia:
                    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                    {
                        if (!File.Exists(folderBrowserDialog1.SelectedPath + @"\team fortress 2 content.gcf"))
                        {
                            Cursor = Cursors.Arrow;
                            var res = MessageBox.Show(
                                "team fortress 2 content.gcf could not be found in that folder!\r\nPlease select your SteamApps folder!",
                                "TF2 Items Editor",
                                MessageBoxButtons.OKCancel,
                                MessageBoxIcon.Error);
                            if (res == DialogResult.OK)
                            {
                                goto showDia;
                            }
                            return;
                        }
                        Settings.Default.SteamFolder = folderBrowserDialog1.SelectedPath;
                        Settings.Default.Save();
                    }
                    else
                    {
                        return;
                    }
                }
                Cursor = Cursors.WaitCursor;
                string[] dirs = Directory.GetDirectories(Settings.Default.SteamFolder);
                if (string.IsNullOrEmpty(Settings.Default.SteamUser))
                {
                    var match = new List <string>();
                    foreach (string _dir in dirs)
                    {
                        string dir = (new DirectoryInfo(_dir)).Name;
                        if (dir != "common" && dir != "media" && dir != "SourceMods")
                        {
                            match.Add(dir);
                        }
                    }
                    if (match.Count > 1)
                    {
                        using (var win = new SteamFolderSelectWindow())
                        {
                            string ret = win.ShowWindow(match);
                            if (ret == "")
                            {
                                return;
                            }
                            Settings.Default.SteamUser = ret;
                            Settings.Default.Save();
                        }
                    }
                    else if (match.Count == 1)
                    {
                        Settings.Default.SteamUser = match[0];
                        Settings.Default.Save();
                    }
                    else
                    {
                        Cursor = Cursors.Arrow;
                        MessageBox.Show("No user folders found in steamapps!",
                                        "TF2 Items Editor",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error);
                        return;
                    }
                }
                Cursor = Cursors.WaitCursor;
                string p = Settings.Default.SteamFolder + @"\team fortress 2 content.gcf";
                HLLib.hlPackageOpenFile(p, uiMode);
                IntPtr pRoot = HLLib.hlPackageGetRoot();
                IntPtr pItem = HLLib.hlFolderGetItemByPath(pRoot, filePath + file, HLLib.HLFindType.HL_FIND_ALL);
                p = Settings.Default.SteamFolder + @"\" + Settings.Default.SteamUser +
                    @"\team fortress 2" + filePath;
                Directory.CreateDirectory(p);
                if (File.Exists(p + file))
                {
                    File.Delete(p + file);
                }
                if (!HLLib.hlItemExtract(pItem, p))
                {
                    Cursor = Cursors.Arrow;
                    MessageBox.Show("Error when extracting:\r\n" +
                                    HLLib.hlGetString(HLLib.HLOption.HL_ERROR_SHORT_FORMATED));
                    retVal = "";
                    Close();
                }
                Cursor = Cursors.WaitCursor;
                retVal = File.Exists(p + file) ? p + file : "";
                Close();
            }
            else if (radioSteamapps.Checked) //Find in steamapps
            {
                Cursor = Cursors.WaitCursor;
                Settings.Default.OpenFileSetting = 1;
                if (Settings.Default.SteamFolder == null || Settings.Default.SteamFolder.ToString() == "")
                {
showDia:
                    if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
                    {
                        if (!File.Exists(folderBrowserDialog1.SelectedPath + @"\team fortress 2 content.gcf"))
                        {
                            Cursor = Cursors.Arrow;
                            var res = MessageBox.Show(
                                "team fortress 2 content.gcf could not be found in that folder!\r\nPlease select your steamapps folder!",
                                "TF2 Items Editor",
                                MessageBoxButtons.OKCancel,
                                MessageBoxIcon.Error);
                            if (res == DialogResult.OK)
                            {
                                goto showDia;
                            }
                            return;
                        }
                        Settings.Default.SteamFolder = folderBrowserDialog1.SelectedPath;
                        Settings.Default.Save();
                    }
                    else
                    {
                        return;
                    }
                }
                Cursor = Cursors.WaitCursor;
                string[] dirs = Directory.GetDirectories(Settings.Default.SteamFolder);
                if (string.IsNullOrEmpty(Settings.Default.SteamUser))
                {
                    var match = new List <string>();
                    foreach (string _dir in dirs)
                    {
                        string dir = (new DirectoryInfo(_dir)).Name;
                        if (dir != "common" && dir != "media" && dir != "SourceMods")
                        {
                            match.Add(dir);
                        }
                    }
                    if (match.Count > 1)
                    {
                        using (var win = new SteamFolderSelectWindow())
                        {
                            string ret = win.ShowWindow(match);
                            if (ret == "")
                            {
                                return;
                            }
                            Settings.Default.SteamUser = ret;
                            Settings.Default.Save();
                        }
                    }
                    else if (match.Count == 1)
                    {
                        Settings.Default.SteamUser = match[0];
                        Settings.Default.Save();
                    }
                    else
                    {
                        Cursor = Cursors.Arrow;
                        MessageBox.Show("No user folders found in steamapps!",
                                        "TF2 Items Editor",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error);
                        return;
                    }
                }
                string p = Settings.Default.SteamFolder + @"\" + Settings.Default.SteamUser +
                           @"\team fortress 2" + filePath + file;
                retVal = File.Exists(p) ? p : "";
                if (!File.Exists(p))
                {
                    Cursor = Cursors.Arrow;
                    MessageBox.Show("Couldn't find " + file + "!\r\nPlease make sure it is present in " + p,
                                    "TF2 Items Editor",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                    return;
                }
                Close();
            }
            else if (radioManual.Checked) //Find manually
            {
                Settings.Default.OpenFileSetting = 2;
                openFileDialog1.Filter           = file.Split('.')[1] + " files|*." + file.Split('.')[1];
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    retVal = openFileDialog1.FileName;
                    Close();
                }
                else
                {
                    retVal = "";
                    return;
                }
            }
        }
예제 #19
0
 public static bool ErrorCheck(bool ret)
 {
     if (!ret)
     {
         MessageBox.Show("Error reading pak01_dir.vpk.\n\n The error reported was: ".Localize() + HLLib.hlGetString(HLLib.HLOption.HL_ERROR_LONG_FORMATED), "Error opening .pak".Localize(), MessageBoxButtons.OK);
         return(true);
     }
     return(false);
 }
예제 #20
0
 public static void Shutdown()
 {
     HLLib.hlShutdown();
 }
예제 #21
0
 public static void ErrorCheck(bool ret)
 {
     if (!ret)
     {
         MessageBox.Show("Error reading pak01_dir.vpk.\n\n The error reported was: " + HLLib.hlGetString(HLLib.HLOption.HL_ERROR_LONG_FORMATED), "Error opening .pak", MessageBoxButtons.OK);
         Shutdown();
         Properties.Settings.Default.AddOnPath = String.Empty;
         Properties.Settings.Default.Save();
         Environment.Exit(0);
     }
 }