-
Notifications
You must be signed in to change notification settings - Fork 11
Article suit parts: blobs #32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
1a627b5
f54bac3
be8d3b2
32f0eb4
6cf5283
3375cea
11dd32e
4ba39ea
bbcd488
ea2c57f
56f1302
d3335d9
96fcc5b
58378a6
d6befcc
c7c5f63
75869a0
b1d87c0
e3e9a1b
8bd7586
8721fe2
8e6887a
9993271
42ea6d9
237b2a3
48bc225
3768c16
9444269
59d5838
309bed8
1c38d6b
7706319
e32068c
1d0c5ae
d438067
787752b
b62962b
c521f3e
9a04add
fb1a9fa
2ad9f14
028e54d
b5cae6f
cb527fe
948b6d7
9675d15
e1040cc
cc29415
2061888
fcf4a97
08316e9
4456994
65487d3
5a9d930
f51eecb
8989a5c
551961b
7b4d774
438589d
3aac650
cc2b254
b16c2be
947d68e
e1edae3
13b5b17
67254fe
735f139
de64613
e93260d
1446add
139f03d
4c99bf3
3b4c3f7
c6d70bf
603dabe
4ce084a
6649b7e
675914f
e806e6f
d32488a
1c8294e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1 +1,3 @@ | ||
| nodeLinker: node-modules | ||
|
|
||
| yarnPath: .yarn/releases/yarn-3.6.4.cjs | ||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,253 @@ | ||||||
| --- | ||||||
| sidebar_position: 3 | ||||||
| description: Modifying an image in the menu | ||||||
|
|
||||||
| --- | ||||||
| # Adding "Blobs" | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Quotes are not necessary, blobs are what they are called
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I did that to introduce an unfamiliar term. I'll change it |
||||||
|
|
||||||
|
|
||||||
| To continue on the previous adding/patching of parts article from before, you'll likely also want to; | ||||||
| - modify the image in the menu to reflect the changes you've made | ||||||
| - change the suit's name in the menu | ||||||
| - and even add in your own custom description for your suit. | ||||||
|
|
||||||
| I'll also be mentioning a potential issue that arises when you're trying to | ||||||
| - add parts to your suit that don't come from a reward suit chunk (chunk0) which will have to be solved in the manifest. | ||||||
|
|
||||||
|
|
||||||
|
|
||||||
| :::note Documentation | ||||||
| If you haven’t reviewed SMF’s documentation resources (the book icon on the left when you enable developer mode in SMF), consider skimming these then return here. I also made a little tutorial on adding parts with screenshots. Use it in combination with the previous article (because the code is unreadable). Here’s another excellent resource worth bookmarking for later: | ||||||
|
|
||||||
| - [Hitman Resources Documentation](https://hitman-resources.netlify.app/documentation) - An advanced look at WOA’s engine systems. | ||||||
| - [Adding Suit Parts guide](https://www.nexusmods.com/hitman3/articles/63) - A guide on adding parts with screenshots. | ||||||
| ::: | ||||||
|
|
||||||
| >First up, let's try changing just the image in the menu with your custom image. These are called **"blobs"** | ||||||
|
|
||||||
| --- | ||||||
|
|
||||||
| ## STEP 1: **LOCATE YOUR FILE** | ||||||
| First, let's locate your suit within the **repository**, using either RPKG or GlacierKit. | ||||||
|
|
||||||
| There are 2 methods for this part. I'll do **RPKG** first since it's a bit more easier to find and confirm your image directly. I still suggest you try the **GlacierKit** method too for reasons I will explain later on. | ||||||
|
|
||||||
|
|
||||||
| ### Method 1: Using RPKG | ||||||
|
|
||||||
| 1. Open **RPKG** | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would recommend GlacierKit over RPKG wherever possible
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's what I'm gonna do in my next article concerning overrides. The only reason why rpkg was used is bc of the user friendly oversight of the repo with the pictures. I'll add a second method with glacier to the article to use glacier that nicely flows into the next article. Might make it easier to stay on glacier too |
||||||
| 2. In **RPKG**, click on *Import* in the top left corner. | ||||||
| 3. Select *Import RPKGs folder* and locate your Hitman 3 runtimes folder (it usually looks like this: `D:\SteamLibrary\steamapps\common\HITMAN 3\Runtime`). | ||||||
| 4. Once the folder is imported, click on the big **REPO** tab button next to *Resource Overview*. | ||||||
| 5. Then, click *Load REPO from RPKGS folder*. Now you’ll see everything neatly ordered with a good overview of each category. This is the **Repository**. | ||||||
| 6. Expand the *Outfits* section below. Search for your outfit there. Or use the search bar on top. | ||||||
|
|
||||||
| >Leave your **RPKG** program open after finding your suit | ||||||
|
|
||||||
| ### Method 2: Using GlacierKit | ||||||
|
|
||||||
| 1. Open **GlacierKit** | ||||||
| 2. Select the *game contents* tab on the left. | ||||||
| 3. - Copy the following **repository's** file hash ```00204D1AFD76AB13``` and paste it on the search bar there and hit enter. | ||||||
| - Or simply type ***pro.repo*** on the search bar and hit enter. | ||||||
| Both methods should bring you to a single file called ***pro.repo***. | ||||||
| 4. Open it by clicking on it (obviously) and then click on *Open in editor* in the new menu that popped up on the right. This is the **repository** but in **Glacierkit** | ||||||
|
|
||||||
| :::tip | ||||||
| You now know the exact name of the **repository** file. Next time you want to open the **repository** in **GlacierKit** just type ***pro.repo***. | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This tip is just restating step 3 but saying not to do part of step 3, you can just make step 3 "search pro.repo" instead of "copy this hash and then paste and hit enter but actually don't do that use pro.repo instead" |
||||||
| ::: | ||||||
|
|
||||||
| 5. You can then start searching for your suit below in the *Unmodified section*. | ||||||
| 6. Double check if you have the right suit selected by looking up the image in **GlacierKit**. | ||||||
| To do so, simply | ||||||
|
|
||||||
| - find the correct image code line on the right that starts with ``"Image":".....`` | ||||||
|
|
||||||
| - and locate its **assembly path** | ||||||
|
|
||||||
|
|
||||||
|
|
||||||
| >The **assembly path** is the line after ``"Image":"..."`` inside the quotation marks. | ||||||
|
|
||||||
| Example of a full image code: | ||||||
| ```json | ||||||
| "Image": "images/unlockables_override/47_outfits_bloodmoney_gloves.jpg" | ||||||
| ``` | ||||||
| and its **assembly path** | ||||||
| ```json | ||||||
| images/unlockables_override/47_outfits_bloodmoney_gloves.jpg | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is not an assembly path, it's a blob path. The assembly path for this blob is much longer because blobs are inside the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Also this should not be a JSON code block |
||||||
| ``` | ||||||
|
|
||||||
| - Copy it and paste the **assembly path** in the search bar on top in the *game contents* tab on the left | ||||||
| - and hit enter on your keyboard. | ||||||
|
|
||||||
|
|
||||||
| If the image you found matches the suit you want to modify, you can go back to your **repository** file. (Where you saw the **repository** code). | ||||||
|
|
||||||
| >Leave open your **GlacierKit** program | ||||||
|
|
||||||
| :::info GlacierKit vs. RPKG | ||||||
| While **RPKG** is helpful for viewing images in the **repository**, it’s best to work primarily in **GlacierKit**, as it will be your main modding tool. The **repository code lines** in both tools are identical for each file, so practicing in **GlacierKit** is encouraged for efficient modding. | ||||||
| ::: | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I do think it'll be a little confusing to show two separate tools for doing something and then say "it's best to not do the first one we told you to do" |
||||||
|
|
||||||
|
|
||||||
| --- | ||||||
| ## STEP 2: **FIND THE IMAGE** | ||||||
| In this step we will have to look for the correct image code and find its **assembly path**. | ||||||
| :::note | ||||||
| You already did this step in the **GlacierKit** method but follow along | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What? Why is this repeated then |
||||||
| ::: | ||||||
| ### 1. Open your file | ||||||
| Click on your suit and you should see its **repository** code on the right | ||||||
|
|
||||||
| ### 2. Locate the assembly path | ||||||
| There will be a line of code starting with `"Image":"....` | ||||||
|
|
||||||
| For example: | ||||||
| ```json | ||||||
| "Image": "images/unlockables_override/47_outfits_bloodmoney_gloves.jpg" | ||||||
| ``` | ||||||
|
|
||||||
| It consists of a | ||||||
| - **file path** `images/unlockables_override/` | ||||||
| - **file name** `47_outfits_bloodmoney_gloves.jpg` | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The whole thing, including the file name, is the file path |
||||||
|
|
||||||
| These 2 together are called the **assembly path** of your file's image. | ||||||
|
|
||||||
| :::warning | ||||||
| Keep **RPKG** and/or **GlacierKit** open, you’ll need to view the **assembly paths**. | ||||||
| ::: | ||||||
|
|
||||||
| --- | ||||||
|
|
||||||
| ## STEP 3: **SET UP A BLOBSFOLDER** | ||||||
| In this step, you’ll create a custom folder structure that ***recreates*** the default image's **assembly path**. | ||||||
|
|
||||||
| ### 1. Make a blobsfolder | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| Create a new folder called ***`blobs`*** in your mod's root directory, where the manifest file is located. You can do this in **GlacierKit** or **File Explorer**. | ||||||
|
|
||||||
| ### 2. Recreate the file path | ||||||
|
|
||||||
| Create folders that match the **file path** of the image you want to replace. | ||||||
| For example, if the **file path** is `images/unlockables_override/`, your `blobs` folder structure should look like this: | ||||||
| ``` | ||||||
| blobs/images/unlockables_override/ | ||||||
| ``` | ||||||
| ### 3. Add your custom image | ||||||
| - Place your image in the last folder you created (in this example, `unlockables_override`). | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I can't see this fully previewed obviously but I feel like this formatting will look odd, having a big size-3 heading with a dot point; usually you'd just have body text instead of placing the step in a dot point (also the previous steps don't use dot points).
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, not being able to preview the site is a problem. Lots of choices are made aren't reflected properly from reviewing the MD file. I was looking into showing and sharing a link to a build version |
||||||
| ### 4. Recreate the file name | ||||||
| - Make sure the custom image has the exact same **file name** and **file type** as the original by changing it, for example: | ||||||
| ``` | ||||||
| blobs/images/unlockables_override/47_outfits_bloodmoney_gloves.jpg | ||||||
| ``` | ||||||
| ### 5. Confirm the assembly path | ||||||
| This fully recreates the **assembly path** above of the image you're replacing. | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Blob path |
||||||
| Your final folder structure should look like this: | ||||||
| ``` | ||||||
| 📁YourModFolder | ||||||
| ├── 📁blobs | ||||||
| │ └── 📁images | ||||||
| │ └── 📁unlockables_override | ||||||
| │ └── 47_outfits_bloodmoney_gloves.jpg | ||||||
| ├── 📁content | ||||||
| ├── manifest.json | ||||||
| └── project.json | ||||||
| ``` | ||||||
| :::danger Important | ||||||
| - **Aspect Ratio**: Match the aspect ratio of your replacement image with the original to avoid distortion. | ||||||
| >*Example*: The Blood Money suit image has a 4:3 ratio (resolution 696x520), which you can check in **GlacierKit**. | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This can just be "for example", you don't really need so much emphasis and a separate quote block |
||||||
| - **File Corruption**: If changing the **file type** manually corrupts your image, use an image converter tool (Photoshop, GIMP, online, etc.). | ||||||
| ::: | ||||||
|
|
||||||
| --- | ||||||
|
|
||||||
| ## STEP 4: **UPDATE MANIFEST** | ||||||
|
|
||||||
| ### 1. Open your manifest | ||||||
| Recommended to do so in **GlacierKit** (or in **VS code** with a ***"schema"***). | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is a huge amount of bold and italic.
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Agree, Blobs article will need a rework with a tooltip. That's the copy of the locals article. A draft for the current locals artoce but condensing it and changing the flow of information |
||||||
|
|
||||||
| ### 2. Add your blobsfolder: | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| Add the following line that will make **SMF** do a ***blobs operation*** and have it refer to your ***`blobs`*** folder | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This line is just words
Suggested change
|
||||||
| ```json | ||||||
| "blobsFolders": ["blobs"] | ||||||
| ``` | ||||||
| >Here’s how your full manifest file might look with a `blobsFolders` line added: | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Quote? |
||||||
| ```json | ||||||
| { | ||||||
| "$schema": "https://raw.githubusercontent.com/atampy25/simple-mod-framework/main/Mod%20Manager/src/lib/manifest-schema.json", | ||||||
| "version": "0.3.0", | ||||||
| "id": "Yourname.Yourmod", | ||||||
| "name": "YourCustomSuit", | ||||||
| "description": "Your description of what your mod does", | ||||||
| "authors": ["YourName"], | ||||||
| "frameworkVersion": "2.33.20", | ||||||
| "contentFolders": ["content"], | ||||||
| "blobsFolders": ["blobs"] | ||||||
| } | ||||||
| ``` | ||||||
| :::info Schema | ||||||
| Notice the `$schema` line at the top. This line helps **VS Code** recognize the structure and options available for the manifest, providing error-checking and code suggestions as you edit. **GlacierKit** includes these features by default, but installing **VS Code** is highly recommended for better flexibility and ease in editing complex files. | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh schemas are explained here, then you don't need to link/quote it earlier |
||||||
| ::: | ||||||
| ### 3. Save & Deploy | ||||||
| Simply click the little save icon on top or click **ctrl+S** on your keyboard. Deploy your mod in **SMF** and your new image will appear in place of the default one. | ||||||
|
|
||||||
| :::success | ||||||
| That's it! You’ve successfully replaced the suit’s image in the game with your own custom picture. Now, when you load up the game, your new image will appear in place of the default one. Don't close **GlacierKit** yet if you already are moving on to the next article or want to try the test below. It'll make things alot quicker. | ||||||
| ::: | ||||||
|
|
||||||
| --- | ||||||
|
|
||||||
| With this final step complete, you’re all set! There are additional tips and options for managing **blobs** in your mod below if you’d like to explore further. | ||||||
|
|
||||||
| --- | ||||||
| ## More on Blobs | ||||||
| These tips will help you manage multiple images and **blobsfolders**. | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
|
|
||||||
| ### More Blobs images | ||||||
|
|
||||||
| - If you want to add more images, remember to recreate the **file paths** by making more folders. | ||||||
| And place each image in its relevant folder | ||||||
|
|
||||||
| examples: | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
|
||||||
| | **Assembly Path** (in-game) | Your **BlobsFolder** Structure | | ||||||
| |--------------------------------------------|---------------------------------------------| | ||||||
| | `images/unlockables_override/absolution_suit.jpg` | `blobs/images/unlockables_override/absolution_suit.jpg` | | ||||||
| | `images/characters/male_suits/caruso_idk.png` | `blobs/images/characters/male_suits/caruso_idk.png` | | ||||||
| | `icons/equipment/distraction_device_old.jpg` | `blobs/icons/equipment/distraction_device_old.jpg` | | ||||||
|
|
||||||
| - For multiple images that have the same **file path** in their **assembly path**, simply place them within the same folders (e.g., images under `unlockables_override`). Don't forget to **rename them too**. | ||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This line basically doesn't make sense (file path? assembly path?) unless you have the definitions earlier, which are not correct. Also rename them to what? |
||||||
|
|
||||||
|
|
||||||
| ### Renaming ***"blobs"*** | ||||||
| You can name your `blobsfolder` whatever you like (e.g., "MyCustomImages"), just update the manifest too after.: | ||||||
| ```json | ||||||
| "blobsFolders": ["MyCustomImages"] | ||||||
| ``` | ||||||
| ### Adding Multiple Blobsfolders | ||||||
| You can even add more **blobsfolders** in your mod. This is useful if your mod will have multiple options that can be selected in your mod's settings. | ||||||
| The same rules apply to them; | ||||||
| - set **file paths** by making folders | ||||||
| - and use correct **file name(s)** | ||||||
|
|
||||||
| You can then add them to the manifest by simply adding a comma and the name of the new folder in quotation marks. | ||||||
|
|
||||||
| ```json | ||||||
| "blobsFolders": ["blobs","MyCustomImages","MoreBlobs"] | ||||||
| ``` | ||||||
|
|
||||||
| --- | ||||||
| :::info challenge | ||||||
| *Up for a challenge?* | ||||||
|
|
||||||
| Reinforce what you learned by replacing more images in the game using **only** the steps below: | ||||||
|
|
||||||
| - Locate image(s) in the **repository** | ||||||
| - Set up a new **blobs folder** and recreate **file paths** | ||||||
| - Add your images and ensure **file names** match | ||||||
| - Update the **manifest**, deploy, and test in-game | ||||||
|
|
||||||
| Repeat steps you struggled with until they’re familiar—if you can complete these steps without looking at the tutorial, you’re ready for the next article! | ||||||
| ::: | ||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| --- | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm gonna assume these copy files are just drafts written by ChatGPT and not intended to be on the website?
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The copy files are me making some changes to when new information gets introduced. Like in the blobs folder it's all over the place so as not to overwhelm the user with technical jargon and kind of reel them in the process while they're learning stuff |
||
| sidebar_position: 6 | ||
| description: Changing tsdvmore | ||
| --- | ||
|
|
||
| import './customhover.css'; | ||
| import Tooltip from './tooltip'; | ||
|
|
||
| # Adding Shorter locals CONDENSED | ||
| --- | ||
|
|
||
| ### Part 1: Setting Up & Finding Your LOCR | ||
|
|
||
| 1. **LOCR Introduction**: | ||
| - *All game text is stored in LOCR files.* These files contain game text in various languages, linked to identifiers called **HASHES**. | ||
|
|
||
| 2. **Introducing Hashes for Suits**: | ||
| - Example hashes for common suits: | ||
| - *Season 1 suits*: `00985A1100E5EDDC` | ||
| - *Season 2 suits*: `009F430D046716BE` | ||
| - *Season 3 suits*: `004B8C5124A49543` | ||
| - **Copy the HASH** that matches your suit. | ||
|
|
||
| *Insert* **Help: Hash** *admonition here.* | ||
|
|
||
| 3. **Navigate to the LOCR File and Open It**: | ||
| - *Paste your HASH into the search bar in GlacierKit and open the LOCR file.* | ||
|
|
||
| 4. **LOCR Breakdown**: | ||
| - *Before diving deeper, let's understand how a LOCR file is organized.* | ||
|
|
||
| *Insert* **LOCR Breakdown** *collapsible here.* | ||
| - *This breakdown will help you understand why we structure the manifest in the next part.* | ||
|
|
||
| 5. **Confirm Your Text Using Ctrl + F**: | ||
| - Use `Ctrl + F` inside the LOCR file to find and confirm the text you want to change. | ||
| - *This ensures you're editing the correct piece of text.* | ||
|
|
||
| 6. **Notice and Copy the String**: | ||
| - *Each piece of text is linked to a string.* | ||
| - **Copy the string** (without quotes) that appears before the text you want to modify. | ||
|
|
||
| *Add a short collapsible explanation for strings if needed.* | ||
|
|
||
| 7. **Advanced Search (Optional)**: | ||
| - *For finding additional text, see the Advanced Search guide.* | ||
|
|
||
| *Insert* **Advanced Search** *collapsible here.* | ||
|
|
||
| --- | ||
|
|
||
| ### Part 2: Modifying the Manifest | ||
|
|
||
| 1. **Open Your Manifest File**: | ||
| - *Navigate to your manifest file in GlacierKit.* | ||
|
|
||
| 2. **Add This Line**: | ||
| ```json | ||
| "localisationOverrides": {} | ||
| ``` | ||
|
|
||
| 3. **Add Your LOCR Hash and Language**: | ||
| - *Insert the LOCR hash and specify the language.* | ||
| - *(This recreates the LOCR file’s structure.)* | ||
|
|
||
| 4. **Explain the Detour to Text Tools**: | ||
| - *Before using our string in the manifest, we need to convert it.* | ||
|
|
||
| 5. **Convert the String Using Text Tools**: | ||
| - *Open the Text Tools tab and paste your string into the Localisation Hash Calculator.* | ||
| - *Copy the decimal number (ignore the hex code).* | ||
|
|
||
| 6. **Finish Your Manifest**: | ||
| - *Return to the manifest and paste the decimal number with your custom text.* | ||
| - **Example**: | ||
| ```json | ||
| "localisationOverrides": { | ||
| "yourLOCRhash": { | ||
| "english": { | ||
| "yourconverteddecimal": "Your new text" | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ### Extras and Optional Chapters | ||
|
|
||
| *Include optional content, like adding more languages or advanced techniques, in collapsible sections.* | ||
|
|
||
| --- | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should the node linker be changed? Currently the website seems to be using yarn PnP