• Hello Guest!

    We have recently updated our Site Policies regarding the use of Non Commercial content within Paid Content posts. Please read the new policy here.

    An offical announcement about this new policy can be read on our Discord.

    ~The VaMHub Moderation Team
  • Hello Guest!

    We posted an announcment regarding upcoming changes to Paid Content submissions.

    Please see this thread for more information.

[Tool] Dependencies fixing and resolving tool

amaimon

Member
Messages
44
Reactions
107
Points
18
Being sick of lots of missing resources in VAM error log (due to saves from Easy Mate) I've created a simple tool, that fixes a lot of problems. Currently:

- it gathers all "cs", "cslist", "dll", "png", "tif", "vmb", "vap", "vaj", "vmi", "vam", "vac", "assetbundle", "mp3", "wav" file locations and searches all "url", "uid", "genitalsSpecularUrl", "genitalsGlossUrl", "genitalsNormalUrl", "id", "assetUrl", "faceDiffuseUrl",
"torsoDiffuseUrl", "limbsDiffuseUrl", "faceDecalUrl" tags in JSONs for missing files and repoints them to existing copies found elsewhere inside VAM folder OR var packages.

- it copies around missing vmi to vmb or vice-versa.

- lists missing dependencies it can't handle

I'm planninng on adding a "source repo" path, so it can copy packages and various assets from a directory that you keep outside of your VAM hierarchy, but even currently I'm really happy with what it does.

The question is - any more tags I should scan for paths? Any more file extensions?

Example output of a session (not much to see, as many deps have been already fixed):

Examining and fixing morphs ======================
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\AUTO\Button InOut.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\AUTO\Button Size.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\AUTO\LY_Lumikki_Nipple.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\Breast Control for Genesis 2 Female(s)\Areola UpDown.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\Button Height.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\Chest-Mods\!Breast Width.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\Chest_Reloaded\Nipples_04_Small.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\DAZ\Clarissa\Clarissa Body.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\EasyFeet\G3F_SFD_FC_BF_DorsumShape.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\Feet 2.0\Left Big Toe Out.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\Feet 2.0\Left Pinky Out.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\Feet 2.0\Right Big Toe Out.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\Feet 2.0\Right Pinky Out.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female\YY\Muscularity for Genesis 2 Female\CTRLMuscularityOnSWM.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female_genitalia\Daryl-b1a15389-Genital.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\female_genitalia\Varla-30cfa2af-Genital.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\male\SimonWM\Muscularity for Genesis 2 Male\CTRLMuscularityOnSWM.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\male\SimonWM\Muscularity for Genesis 2 Male\PBMExternalObliqueThoraicicSWM.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\male_genitalia\AUTO\Base Up-Down.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\male_genitalia\Base_Girth.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\male_genitalia\GensMorphsControls\Male_genitalia\Base Up_Down.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\male_genitalia\X_Girth.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\male_genitalia\X_Lenght.vmi - MISSING vmb counterpart!
E:\Games2\VAM\Custom\Atom\Person\Morphs\male_genitalia\X_Size.vmi - MISSING vmb counterpart!
Examining refs in saves ======================
Plugin E:\Games2\VAM\Saves\Scene\Reddituser4616\threesome dark bedroom scenes\Menu.json refers non existing Custom\Textures\geesp0t\Main Menu\Person_2_Right_Right.png
Plugin E:\Games2\VAM\Saves\Scene\Unknown\Double BJ\Double BJ.json refers non existing Custom\Assets\stripclub privè.assetbundle
Missing resources list ==============================
Custom\Textures\geesp0t\Main Menu\Person_2_Right_Right.png
Custom\Assets\stripclub privè.assetbundle
Packages with missing resources ==============================
E:\Games2\VAM\Saves\Scene\Reddituser4616\threesome dark bedroom scenes\Menu.json
E:\Games2\VAM\Saves\Scene\Unknown\Double BJ\Double BJ.json
 
I'm planninng on adding a "source repo" path, so it can copy packages and various assets from a directory that you keep outside of your VAM hierarchy

^ THIS! I need this! You'll be my hero foreverandever if you release this tool.
 
Yeah, I'm getting close to making it user-ready, as long as you are able to work with command line.

Anyway - copying VARs from the repo dir now works.

Also - I like mocaps. So I've added a feature that scans saves and VARs for mocaps, it's faster than opening each scene by hand :D
 
Wow @amaimon. A hero's work. Thank you! I look forward to it. (y)
Being fairly new here I can't add any ideas but the amount of legwork you'll save us is extraordinary. 🙂
 
OK, my script is almost end-user ready (still - you run it from the command line), what's left to do is "just log" mode that will not touch anything, but only dump the log, so you can see what will be fixed. Currently everything is logged to CSV for easy formattiong. Example entrires:

Code:
INFO; "Custom/Scripts/Acidbubbles/VamTimeline/VamTimeline.AtomAnimation.cslist"; "plugin#0"; "Fixed script location"

INFO; "Saves/scene/Acidbubbles/FemalePovFuta/double-blowjob.json"; ""; "Written to ZIP"

INFO; "AcidBubbles.FutaFemalePovDoubleBlowjob.2:\Saves\scene\Acidbubbles\FemalePovFuta\double-blowjob.json"; ""; "Saved"

ERR ; "Alter3go.Alter3go_Astr?e.1:\Saves\scene\Alter3go\Alter3go - Astr?e\Alter3go Astr?e.json"; "SELF:\Custom\Atom\Person\Morphs\female\[4lt3r3g0]\[Alter3go] Astrèe.vmi"; "Missing reference"

WARN; "E:\Games2\VAM\AddonPackages\Gegecucu.Intimate_Moment.5.var"; "meta.json"; "malformed JSON in VAR: com.google.gson.stream.MalformedJsonException: Unterminated object at line 94 column 5 path $.dependencies.AcidBubbles.Timeline.209"

WARN; "E:\Games2\VAM\AddonPackages\hazmhox.vammoan.1.var"; "Custom/Scripts/VAMMoan/audio/voice-shared.json"; "malformed JSON in VAR: com.google.gson.stream.MalformedJsonException: Expected name at line 204 column 6 path $.female.blowjobs"

INFO; "Sapuzex.Beach_sunset.1:\Saves\scene\sapuzex\Beach sunset\creamthree.json"; "sapuzex.Cooking_Lesson.1:/Saves/scene/sapuzex/audio file/Nature Sounds - Tropical Beach - Sound effects - 10 mins.mp3"; "Repointed path A"

INFO; "Sapuzex.Beach_sunset.1:\Saves\scene\sapuzex\Beach sunset\creamthree.json"; "Sapuzex.Beach_sunset.1:/Saves/scene/sapuzex/Beach sunset/m1000vl-sorbet_01__54902.1520904771.png"; "Repointed path A"

INFO; "Custom/Scripts/Spankings/Reset VR Orientation/ResetVROrientation.cs"; "plugin#0"; "Fixed script location"

INFO; "jar:file:///E:/Games2/VAM/AddonPackages/Sapuzex.Beach_sunset.1.var"; "Saves\scene\sapuzex\Beach sunset\creamthree.json"; "Writing ZIP"

INFO; "Saves/scene/sapuzex/Beach sunset/creamthree.json"; ""; "Written to ZIP"

INFO; "Sapuzex.Beach_sunset.1:\Saves\scene\sapuzex\Beach sunset\creamthree.json"; ""; "Saved"

WARN; "E:\Games2\VAM\AddonPackages\vamX.0.9.var"; "Custom/Scripts/vamX/resources/animation/C&G Studios/C&G Studios Late Nite Dance.json"; "malformed JSON in VAR: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 956303 column 8 path $"
 
Since you're already gathering the data, you should implement identifying unused morphs or VARs (with no used content). I'm trying to trim down my content, but have no idea what can be deleted.
 
Unless I know ABSOLUTELY all places that point to resources (see OP), I can't be really sure a resource is unused. But it would be quite easy to find duplicate morphs, remove them and repoint to the only existing copy, though. Might also work for assets...
 
Unless I know ABSOLUTELY all places that point to resources (see OP), I can't be really sure a resource is unused. But it would be quite easy to find duplicate morphs, remove them and repoint to the only existing copy, though. Might also work for assets...

That would be immensely useful.

Other (belated) feature request:
Would it be possible to extract & store the data for an appearance-preset (.vap) from a scene json?
 
Heh, I guess so. Are they referenced by gsons? Also - where should I store them?
 
Being sick of lots of missing resources in VAM error log
Just a word of warning to any new users, who might be thrown completely in the wrong direction by this. You SHOULD not ever need this tool, except when trying very old content from before we had VAR packages (e.g. EasyMate). If you have errors, you most likely did try to unzip VAR packages or are missing dependencies. There is a known issue with some browsers auto-renaming .VAR files to .ZIP when downloaded, especially when downloaded from Patreon sites. This seems to cause unknowing users to mistakenly extract those packages rather than putting them simply into the AddonPackages folder.
Check out this guide on how to install content properly, have VaM auto-download missing stuff for you, etc.
 
While I guess that's how VARs are SUPPOSED to work, there are a TON of missing references in the VARs I have, AND THEY DON'T SHOW in package manager. That's one. And there are also corrupt VARs (with illegal characters in file names) and malformed JSONs inside VARs, so I guess this tool is still pretty usable! :D
 
Just a word of warning to any new users, who might be thrown completely in the wrong direction by this. You SHOULD not ever need this tool, except when trying very old content from before we had VAR packages (e.g. EasyMate). If you have errors, you most likely did try to unzip VAR packages or are missing dependencies. There is a known issue with some browsers auto-renaming .VAR files to .ZIP when downloaded, especially when downloaded from Patreon sites. This seems to cause unknowing users to mistakenly extract those packages rather than putting them simply into the AddonPackages folder.
Check out this guide on how to install content properly, have VaM auto-download missing stuff for you, etc.

Thanks, MacGruber. As a newbie myself it is good to know. I have the last Easy Mate and it's the full package. Thanks for the guide!
 
@MacGruber just for you I've added a module that scans VAR packages for references to files that are outside of package scope :D

WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/female/Arms&Hands_Reloaded/Shoulder Height.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/female/AUTO/_test_facegen1.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/female/AUTO/Head Proportion.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/male/HellFishStudios/HFS Shapes/HFS_Shapes_Cranium02.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/female/AUTO/Iris Depth_DD.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/female/Arms&Hands_Reloaded/Shoulder Height.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/female/AUTO/Head Proportion.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/male/HellFishStudios/HFS Shapes/HFS_Shapes_Cranium02.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/female/AUTO/Iris Depth_DD.vmi!"
WARN; "Alter3go.DANA.2.var"; "uid"; "Depends on loose file Custom/Atom/Person/Morphs/female/Arms&Hands_Reloaded/Shoulder Height.vmi!"

I have lots of those...
 
Heh, I guess so. Are they referenced by gsons? Also - where should I store them?

Just to clarify: I mean 1) Scan a scene-file (.json) containing a look 2) extract the data relevant for the appearance-preset (like scale, clothing, hair, morphs (appearance), etc -> cf fifth column in reference below)), and 3) store that data as a regular appearance-preset (.vap). Folder for those is [VaM_root]/Custom/Atom/Person/Appearance/... ?

For reference:

Background is that many creators publish their looks in form of a full scene-file - eg. for presentation purposes - but those tend to have a pretty heavy impact on loading times, so I try to get rid of as many of them as possible. Of course it's possible to load the scene and save the look as an appearance-preset manually, but that's a bit tedious (and slow-going, due to having to load the scene in VaM) - it would be nice to have an external tool.


P.S.: There used to be a tool called vaminspector by VamDeluxe that did smth similar for .vac files back in the day -> It scanned vacs, and if it found person-atoms, created (legacy) looks-presets, copied textures to the correct folders etc. (https://github.com/vamdeluxe/vaminspector)
 
Last edited:
Unless I know ABSOLUTELY all places that point to resources (see OP), I can't be really sure a resource is unused. But it would be quite easy to find duplicate morphs, remove them and repoint to the only existing copy, though. Might also work for assets...

Another imposition, if I may?

It'd be nice to have the option to choose a preferred source-reference for the morph - background is that a large share of morphs used in the community is by now available in a handful of standard morphpacks available on the hub (Kemenate, CuteSvetlana, Dilldoe, Spacedog etc) on the one hand, but on the other, there's quite a few looks-creators who still bundle individual morphs contained in those standard packages together with their looks (I guess bcs quite a few of those packs pre-date the .var era, and many creators have the morphs in those packs as loose files in their installation - so when they create a .var and choose 'fix', VaM will pick the morph from their /Custom/Atom/Person/Morphs/... folder & add it to the .var they're creating).

Long story short: For quite a lot of morphs, I have several different .vars beyond the standard package that I would like to be referenced - and many of those .vars are looks that I actually want to get rid off.
 
Added another tool - finding duplicate morphs by md5 checksum.

Code:
Takie same: R96jXhS5xBUfClGNtYQgxw== - 3, names: Eye Bottom Shape J.vmi, Eye Bottom Shape J.vmi, Eye Bottom Shape J.vmi
Takie same: gv0KyM+S+nFcR7ij0v4NWA== - 3, names: Eyelids Asian Shift.vmb, Eyelids Asian Shift.vmb, Eyelids Asian Shift.vmb
Takie same: 0PDbl/elQxF1WEOgC2JCMg== - 3, names: Eyelids Asian Shift.vmi, Eyelids Asian Shift.vmi, Eyelids Asian Shift.vmi
Takie same: bLdoxqY9hgevDcGkpr6W1w== - 4, names: Eyelids Upper Define.vmb, Eyelids Upper Define.vmb, Eyelids Upper Define.vmb, Eyelids Upper Define.vmb
Takie same: t+y2rehrLAOmyap88bMG1g== - 3, names: Eyelids Upper Define.vmi, Eyelids Upper Define.vmi, Eyelids Upper Define.vmi
Takie same: hh2W7ZCP3ZqhVNdkujH2JQ== - 10, names: Eyes depth.vmb, Eyes depth.vmb, Eyes depth.vmb, Eyes depth.vmb, Eyes depth.vmb, Eyes depth.vmb, Eyes depth.vmb, Eyes depth.vmb, Eyes depth.vmb, Eyes depth.vmb
Takie same: zMxjjm2fNtwRrYosRceLeg== - 4, names: Eyes depth.vmi, Eyes depth.vmi, Eyes depth.vmi, Eyes depth.vmi
Takie same: BEoVoCmfXq4vX4krrEXb+Q== - 2, names: Eyes depth.vmi, Eyes depth.vmi
Takie same: kVERKfYLTzLLgCW1VyyRuA== - 2, names: Eyes depth.vmi, Eyes depth.vmi
Takie same: T8YAJ8tKyFsIvUPqFCGVow== - 11, names: Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb, Eyes height with eyebrow.vmb
Takie same: 0MWks40/5wEP0vfChsX3yA== - 4, names: Eyes height with eyebrow.vmi, Eyes height with eyebrow.vmi, Eyes height with eyebrow.vmi, Eyes height with eyebrow.vmi
Takie same: WtQ81Niq+aF8eU/G0gXkOw== - 3, names: Eyes height with eyebrow.vmi, Eyes height with eyebrow.vmi, Eyes height with eyebrow.vmi
Takie same: SlE9/gQbVb/V1F+ngFicxg== - 3, names: Eyes height with eyebrow.vmi, Eyes height with eyebrow.vmi, Eyes height with eyebrow.vmi
Takie same: HAqg2vleDsF8ei/0s/tGyQ== - 3, names: Eyes Korean.vmb, Eyes Korean.vmb, Eyes Korean.vmb
Takie same: QFOByp91uovlBkGFZisA9Q== - 3, names: Eyes Korean.vmi, Eyes Korean.vmi, Eyes Korean.vmi
Takie same: /wxh3BvgmjDZQg8CznnkBw== - 2, names: FBMTeenEllieBody.vmb, FBMTeenEllieBody.vmb
Takie same: dsinqwXx9tHb7YRuc7BIfQ== - 2, names: FBMTeenEllieBody.vmi, FBMTeenEllieBody.vmi
Takie same: vCIw2TW/v5wm4DY+GzcO3Q== - 3, names: FHMTeenEllieHead.vmb, FHMTeenEllieHead.vmb, Tofusan Teen Ellie Head.vmb
Takie same: KrZI6417KNHYqGjdubk8pA== - 2, names: FHMTeenEllieHead.vmi, FHMTeenEllieHead.vmi
Takie same: 2Gysyn6YcUjtS45mgvz1Uw== - 2, names: FID_Genesis2Female.vmi, FID_Genesis2Female.vmi
Takie same: Q78Nwq4BzrDNBAuU/zZBFA== - 2, names: FID_Genesis2Female.vmi, FID_Genesis2Female.vmi
Takie same: SEl5JfeTjaQYTovx+rJ1qg== - 6, names: Flat Chested.vmb, Flat Chested.vmb, Flat Chested.vmb, Flat Chested.vmb, Flat Chested.vmb, Flat Chested.vmb
Takie same: pz0jL177c4u92JytZsogBQ== - 3, names: Flat Chested.vmi, Flat Chested.vmi, Flat Chested.vmi
Takie same: cVJgVT+/DoQ0TFvRx0knlQ== - 3, names: G3F_Buttocks Muscular.vmb, G3F_Buttocks Muscular.vmb, G3F_Buttocks Muscular.vmb
Takie same: iHUb76XdnCLwbQRK3b/F7g== - 2, names: G3F_Buttocks Muscular.vmi, G3F_Buttocks Muscular.vmi
Takie same: 1u38Cjr9RX1jEF3g5IIcDg== - 2, names: G3F_Chest Upper Shape.vmb, G3F_Chest Upper Shape.vmb
Takie same: xuy50sWAaRFuziLm/NvXpg== - 2, names: G3F_ChestArmpitsIn.vmb, G3F_ChestArmpitsIn.vmb
Takie same: kBRvT4z85wU3oJxmyL33Pw== - 4, names: G3F_Glutes Shape 07.vmb, G3F_Glutes Shape 07.vmb, G3F_Glutes Shape 07.vmb, G3F_Glutes Shape 07.vmb
Takie same: nw6TPAueMKbTEt68Jr5snQ== - 2, names: G3F_Glutes Shape 07.vmi, G3F_Glutes Shape 07.vmi
Takie same: 6DanL1lpp53AYlLfS9GKGw== - 3, names: G3F_Neck Traps Shape 02.vmb, G3F_Neck Traps Shape 02.vmb, G3F_Neck Traps Shape 02.vmb

and so on...
 
And also:

Code:
Warning: FDmN7Qmlj2eFtwAPvGlwnw== - 5, has many names: [BButton Depth.vmb, Button Depth.vmb]
Warning: xmS/Dr4OBspd0AFwdJVPSA== - 4, has many names: [Belly Smooth  Base.vmb, Belly Smooth Base.vmb]
Warning: 7pM5wPG0Our6WR5OLE+Fow== - 3, has many names: [Belly Smooth  Base.vmi, Belly Smooth Base.vmi]
Warning: vCIw2TW/v5wm4DY+GzcO3Q== - 3, has many names: [FHMTeenEllieHead.vmb, Tofusan Teen Ellie Head.vmb]
Warning: lx2uwS5s0n0Zl796Nx+Kew== - 2, has many names: [AshAuryn_Pain1.vmb, AshAuryn_pain1.vmb]
Warning: x4Y8VxbAhZp1unRjVkpJbQ== - 2, has many names: [AA_laughmuscles2.vmb, AA_laughmuscles3.vmb]
Warning: oD67NH2Mi1gkA5/xKumSow== - 2, has many names: [AA_laughmuscles2_nolift.vmb, AA_laughmuscles3_nolift.vmb]
Warning: AQAqEnNa2uGL5q/8H1MXxg== - 3, has many names: [!Diameter.vmb, Belly Diameter.vmb]
Warning: 8XLrOwCI//tPn4lFWo48hg== - 3, has many names: [BButton InOut.vmb, Button InOut.vmb]
Warning: RKJyDpo+iwD7wop8qHTsEw== - 4, has many names: [BButton Size.vmb, Button Size.vmb]
Warning: ydNSiArMOJfIvTwyCyo6TQ== - 3, has many names: [BButton UpDown.vmb, Button UpDown.vmb]
Warning: XORe4xZRtUPszwhfYDrW/A== - 6, has many names: [Breast upper down.vmb, Breast upper down (2).vmb]
Warning: +5zpWIwdaqu27hlv+I0DZg== - 3, has many names: [Breast upper down.vmi, Breast upper down (2).vmi]
Warning: Ip1owFjpW25Wvyh8ugQRvw== - 4, has many names: [Cheek Sag.vmb, Face Sag.vmb]
Warning: uUWJzUe4Xw8lNNJG9xzSRg== - 5, has many names: [Cheeks Puffy Lower .vmb, Cheeks Puffy Lower.vmb]
Warning: KuJ9uoNh8odc9ZxmJgHGCw== - 4, has many names: [Cheeks Puffy Lower .vmi, Cheeks Puffy Lower.vmi]
Warning: reIv9yL/68KvGv34CRmkaw== - 7, has many names: [Dragonlady_gens.vmb, Mons pubis.vmb, Mons Pubis.vmb]
Warning: qKXjfOHI5UgkxJTY7pCqKg== - 4, has many names: [Face Size.vmb, Face_Size.vmb]
Warning: yKn4O5Lx8eNsXPaFJKDhTw== - 4, has many names: [Face Size.vmi, Face_Size.vmi]
Warning: a/BJSvJR2xX4nucXNdzf8Q== - 6, has many names: [Forehead Height.vmb, Forehead_Height.vmb]
Warning: fwEvl9bnletjgcY1MXG6kQ== - 5, has many names: [Forehead Height.vmi, Forehead_Height.vmi]
Warning: 5OerLAGOduRGCOOwvggGQw== - 2, has many names: [PHMGiselleIrisSize.vmb, PHMEyesIrisSize.vmb]
Warning: O9m5JaEV8BPmodzu0H910w== - 2, has many names: [Button Height.vmb, BButton Height.vmb]
Warning: 9R6Au/M88pn9WXn48mv9Og== - 2, has many names: [_INZBC~F.VMB, __.vmb]
Warning: oTkUXuHMtnLnGBl2DjdUrA== - 2, has many names: [_INZBC~F.VMI, __.vmi]
Warning: gCZzdhhNKpvEHx4Lw9rl5A== - 3, has many names: [G2_Greta.vmb, Greta.vmb]
Warning: OCpQ6KLNVCVd7BvBOl2MSg== - 3, has many names: [G2_Greta.vmi, Greta.vmi]
Warning: hmljErunvU22cC7kTfZuBQ== - 5, has many names: [Gen_Innie.vmb, 1Gen_Innie.vmb, splineVR Trisha-eb49eb39-Genital.vmb]
Warning: uKM1cnHH0unLW+fnhp0CxA== - 2, has many names: [Nipples Apply.vmb, PBMNipplesSize.vmb]
Warning: 0QV+aw0k/LlhyCoUF0p5QA== - 2, has many names: [left surfs up-f99e0167.vmb, left three-929f7896.vmb]
Warning: 7AUdW4uyDDWo02V1758yUg== - 2, has many names: [right surfs up-31e1e1d8.vmb, right three-b9f9e8c4.vmb]
Warning: Yjia9cabaLeWZCrChkejWw== - 2, has many names: [Daryl-b1a15389-Genital.vmb, Kierra F-764c02ff-Genital.vmb]
Warning: lZF/7ae5ZNrAXYuOyANahA== - 2, has many names: [Mousy-Genital.vmb, Varla-30cfa2af-Genital.vmb]
Warning: 5BYfU07uw4/+P+bgaTn7Hw== - 2, has many names: [Hyper zip.vmb, Hyper.vmb]
Warning: AhVbDpQnnI016Mp3uq7k8g== - 2, has many names: [Hyper zip.vmi, Hyper.vmi]
 
Current version:

https://anonfiles.com/n46080n5u7/Vamifier2_jar

Command reference:

@Parameter(names = ["-rd", "--refresh-db"], description = "DATABASE: Force rescan of VAM directory")
var refreshDb: Boolean = false

@Parameter(names = ["-rr", "--refresh-repo"], description = "DATABASE: Force rescan of repository directory")
var refreshRepo: Boolean = false

@Parameter(names = ["-a", "--fix-all"], description = "FIXES: Run all possible fixes")
var fixAll: Boolean = false

@Parameter(
names = ["-s", "--fix-siblings"],
description = "FIXES: Fix missing vmb-vmi or vab-vaj-vam (or delete them if unfixable!)"
)
var fixMorphs: Boolean = false

@Parameter(
names = ["-r", "--fix-save-refs"],
description = "FIXES: Point missing references in saves to existing files"
)
var fixSaveRefs: Boolean = false

@Parameter(
names = ["-rv", "--fix-var-refs"],
description = "FIXES: Point missing references in packages (VAR) to other packages"
)
var fixVarRefs: Boolean = false

@Parameter(
names = ["-dd", "--deduplicate"],
description = "FIXES: Remove duplicates (by MD5), run fix refs when done"
)
var dedup: Boolean = false

@Parameter(
names = ["-cr", "--clean-repo"],
description = "FIXES: Remove repo files that are present in main game dir"
)
var cleanRepo: Boolean = false


@Parameter(
names = ["-t", "--autoimport-textures"],
description = "FIXES: Create auto-importable textures (interactive)"
)
var textures: Boolean = false

@Parameter(names = ["-lm", "--list-mocaps"], description = "INFO: List modules with mocaps")
var listMocaps: Boolean = false

@Parameter(names = ["-ls", "--list-scripts"], description = "INFO: List scripts")
var listScripts: Boolean = false

@Parameter(
names = ["--write"],
description = "SWITCH: Commit changes - without this option no changes will be made to your VAM"
)
 
How to use it?

Vamifier is able to fix missing dependencies by copying from a second directory you put aside. It has to have the same structure as main VAM directory. I call it the "repo".

To start the script, be sure you have java available from your command line and run:

java -jar vamifier.jar [options - see below]

On first run it will pop a requester to get root path of your game and then the repo directory. Navigate into the directories that contains "Custom", "Saves" and "Addon Packages". Going through all saves, customs and VARs takes A LOT. So be patient.

I did all my best to ensure no file is touched unless you use this option:

"--write" description = "SWITCH: Commit changes - without this option no changes will be made to your VAM"

but there's a tiny-small chance I've overlooked something, so be warned.

"-rd", "--refresh-db" description = "DATABASE: Force rescan of VAM directory" - when you added content to your main directory

"-rr", "--refresh-repo" description = "DATABASE: Force rescan of repository directory"

"-a", "--fix-all" description = "FIXES: Run all possible fixes" - below

"-s", "--fix-siblings" description = "FIXES: Fix missing vmb-vmi or vab-vaj-vam (or delete them if unfixable!)" - I had a lot of orphan vmb or vmi files. They don't work alone, so they are either fixed or deleted.

"-r", "--fix-save-refs" description = "FIXES: Point missing references in saves to existing files" - Fix refs in loose files inside "Custom" and "Saves" directories.

"-rv", "--fix-var-refs" description = "FIXES: Point missing references in packages (VAR) to dependant packages or loose files" - Fix refs inside VARs

"-dd", "--deduplicate" description = "FIXES: Remove duplicates (by MD5), run fix refs when done" - not doing anything yet

"-cr", "--clean-repo" description = "FIXES: Remove repo files that are present in main game dir" - why clutter your disk, you don't need two copies!

"-t", "--autoimport-textures" description = "FIXES: Create auto-importable textures (interactive)" - this is a little helper for renaming textures to be auto-importable. It tries to make some educated guesses about what name it should choose, but asks for user input when nothing works.

"-lm", "--list-mocaps" description = "INFO: List modules with mocaps"

"-ls", "--list-scripts" description = "INFO: List scripts"

Note: Because the script works by pointing missing references to existing files of the same name, there's a chance it will point a ref to wrong file in case there's a lot of files with the exact name (think about torsoD.jpg). I'm in the course of fixing it by marking files with same name and different hash as "ambigious". But currently it's too slow to use.

The script will dump a CSV log to its directory, so if you want to give it a try, just run:

java -jar vamifier.jar --fix-all

It won't touch your files, but everything it WOULD do if you append "--write" option will be shown. You can filter the log by the first column.
 
I ran it a couple of times and it seems to run out of memory pretty often, but does get further. I now tried it with --write, and it throws this error:

java -jar Vamifier2.jar --fix-all --write
DB exists
It seems it's a first time you're running this script, so you have to select root of your VAM directory (the one that contains vam.exe).
You may choose a directory that contains unused assets, saves and packages as a repository that will be used to get missing files. Cancel the dialog if you don't have a repo.
Exception in thread "main" java.lang.NoSuchMethodError: java.io.FileWriter.<init>(Ljava/io/File;Ljava/nio/charset/Charset;)V
at pl.qus.wolin.MainKt.saveJson(Main.kt:133)
at pl.qus.wolin.JsonDbFile.save(JsonDbFile.kt:17)
at pl.qus.wolin.Main.main(Main.kt:960)
 
You have old Java version - it's missing FileWriter in NIO.

Btw - how much memory do you have?
 
Back
Top Bottom