gm_mount2 – Mount everything in GMod – Current state
In the past two weeks, I have been working on gm_mount2, an adaption but also totally rewrite from scratch of this addon for GMod.
My intention first was making it mount games automatically if you install it serverside (the way it is in that link needs heavy modifications to make it run) and an easy integration into GMod’s default mounting-menu.
This was done really easily and I started thinking about “why can’t garry make GMod mount L4D?”. I took some more deeper research into it and found out, that L4D and L4D2 don’t use GCF-files to store their models, sounds and everything in – They use VPK files which are unsupported for mounting in the OrangeBox version of the Source-Engine where GMod runs on.
Luckily it rushed into my mind that Nemesis, the coder of GCFScape, has a library called HLLib which allows reading from VPK containers. It took me around 2 hours to figure out how HLLib works and I made my first successful attempt in reading from VPKs.
But now the torture began: How shall I tell GMod to read from VPKs? My idea was overriding default FileIO functions of Source which are stored in the interface IFileSystem and IBaseFileSystem. My idea was using MS Detours which is known to be detectable by VAC so I searched different ways for about 3 days before I got told “VAC in GMod is active but does not ban” (yet).
So the plan was clear: Detouring the methods of the interface and intercept if a file within a VPK is requested. It was all so clear and easy in my head but I got beaten down by reality really fast again. The methods of the interface I have to hook/overwrite are virtual, which makes them a pain in the ass to hook. It took me 2 days with the help of mainly Jinto before I was able to hook those. If any developer is interested in, you can find my VDETOUR script here.
Hooking now worked but I first had to figure our a fast and efficient way of tracing opened files so I can tell it’s either a file within a VPK or a “normal file”. This took me 3 more days.
Today I had my first successful attempt reading a file from within a VPK in GMod with GMod’s lua function file.Read but it just read about 500 letters at max – how silly.
Recapitulation: It was a pain in the ass to implement. Especially because my lack of knowledge of GMod’s internals. It could have been so much easier to implement if I’d be the mod-coder.
Today I made the successful attempt in loading a model of L4D in GMod using my module. It works flawless! No crashes etc. Now I only have to implement some minor stuff like file-searching and the lua-interface. Maybe one ore two more days and I can release it!