From cd3722767594eafa79c9cd71b418f3e3c5216aa7 Mon Sep 17 00:00:00 2001 From: Temperz87 Date: Wed, 19 May 2021 10:46:41 +0000 Subject: [PATCH 01/13] Delete patching-methods.md --- documentation/harmony/patching-methods.md | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 documentation/harmony/patching-methods.md diff --git a/documentation/harmony/patching-methods.md b/documentation/harmony/patching-methods.md deleted file mode 100644 index 770ab9f..0000000 --- a/documentation/harmony/patching-methods.md +++ /dev/null @@ -1,8 +0,0 @@ -Run this to patch your methods! https://github.com/pardeike/Harmony/wiki/Bootstrapping -```cs -private void Start() -{ - HarmonyInstance instance = HarmonyInstance.Create("me.mymod"); - instance.PatchAll(Assembly.GetExecutingAssembly()); -} -``` \ No newline at end of file -- GitLab From d6608c2aa454a6e3abd4dd0db8d8a4f804168fb9 Mon Sep 17 00:00:00 2001 From: Temperz87 Date: Wed, 19 May 2021 10:46:49 +0000 Subject: [PATCH 02/13] Delete changing-private-variables.md --- documentation/harmony/changing-private-variables.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 documentation/harmony/changing-private-variables.md diff --git a/documentation/harmony/changing-private-variables.md b/documentation/harmony/changing-private-variables.md deleted file mode 100644 index 57e136d..0000000 --- a/documentation/harmony/changing-private-variables.md +++ /dev/null @@ -1,5 +0,0 @@ -Use this snippet to get and set private variables. -```cs -var foo = FindObjectOfType(); -Traverse.Create(foo).Field("privateVariableName").SetValue("world"); -``` \ No newline at end of file -- GitLab From 7ef5b5db1dab8fce1e4487aa3a0a122859d83a66 Mon Sep 17 00:00:00 2001 From: Temperz87 Date: Wed, 19 May 2021 10:46:53 +0000 Subject: [PATCH 03/13] Delete replacing-methods.md --- documentation/harmony/replacing-methods.md | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 documentation/harmony/replacing-methods.md diff --git a/documentation/harmony/replacing-methods.md b/documentation/harmony/replacing-methods.md deleted file mode 100644 index 692de35..0000000 --- a/documentation/harmony/replacing-methods.md +++ /dev/null @@ -1,13 +0,0 @@ -Use this to replace a method. The return false stops the original method. -```cs -[HarmonyPatch(typeof(ClassName))] -[HarmonyPatch("MethodName")] -public class Patch0 -{ - public static bool Prefix() - { - //Your Custom Code - return false; - } -} -``` \ No newline at end of file -- GitLab From 7672c09185f3e438cceee65207a6fc7bd83fab0b Mon Sep 17 00:00:00 2001 From: "DESKTOP-SM4PJFO\\tempe" Date: Wed, 19 May 2021 07:00:39 -0400 Subject: [PATCH 04/13] DOCS! I redid the harmony docs and added the yield return null to wait for scene to load --- .../waiting-for-scenario-to-finish-loading.md | 7 +- .../harmony/Traverse-private-fields.md | 6 ++ documentation/harmony/patching.md | 94 +++++++++++++++++++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 documentation/harmony/Traverse-private-fields.md create mode 100644 documentation/harmony/patching.md diff --git a/documentation/api/waiting-for-scenario-to-finish-loading.md b/documentation/api/waiting-for-scenario-to-finish-loading.md index 751c832..cdd7ba9 100644 --- a/documentation/api/waiting-for-scenario-to-finish-loading.md +++ b/documentation/api/waiting-for-scenario-to-finish-loading.md @@ -20,4 +20,9 @@ private void SceneLoaded(VTOLScenes scene) break; } } -``` \ No newline at end of file +``` +If you want to wait for the flightscene to be ready, consider adding the following code to an IEnumerator. +```cs +while (VTMapManager.fetch == null || !VTMapManager.fetch.scenarioReady || FlightSceneManager.instance.switchingScene) + yield return null; +``` diff --git a/documentation/harmony/Traverse-private-fields.md b/documentation/harmony/Traverse-private-fields.md new file mode 100644 index 0000000..5b8585c --- /dev/null +++ b/documentation/harmony/Traverse-private-fields.md @@ -0,0 +1,6 @@ +# Traverse +Traverse is the class in Harmony that is used to get private variables or functions, a traverse is created as follows. +```cs +Traverse traverse = Traverse.Create(object: objectToTraverse) +``` +After making your traverse, you can read private fields by calling Traverse.Field("yourField").GetValue(), and you can call private functions by doing Traverse.Method("yourmethod").GetValue(), note the return on get value is of type object so you will need to cast it correctly. diff --git a/documentation/harmony/patching.md b/documentation/harmony/patching.md new file mode 100644 index 0000000..24323fd --- /dev/null +++ b/documentation/harmony/patching.md @@ -0,0 +1,94 @@ +# What is Patching? +Patching is the process of running code before or after a function, and sometimes even modifying it. Patching is useful to execute your code after a function, or before one if your mod breaks it entirely. Patching can even stop the original method from executing. + +# Setup +In your ModLoaded function we will add the following code, if you aren't patching and functions this is unnecasarry. +```cs +HarmonyInstance harmonyInstance = HarmonyInstance.Create("YourName.YourMod"); +harmonyInstance.PatchAll(Assembly.GetExecutingAssembly()); +``` +This will tell harmony to use our patches that we have created., after this code has been added we can begin to write our patches. All patches have to happen either before or after a function has executed in harmony, the first patch is called Prefix, and is called before a function, and the other patch is called Postfix, and happens after a function has executed. + +# Prefix +Prefix happens before a function is called, let's take the example code here. +```cs +public class Bar +{ + public void Foo() + { + Console.WriteLine("Bar") + } +} +``` +This code will print Bar to the console, however lets say we want it to print out Foobar before hand, we can accomplish that with the following code. +```cs +[HarmonyPatch(typeof(Bar), "Foo")] // the first argument is the class type, and the second is the name of the function, note that using nameof(class.function) would also work +public class Patch_Foo // the name can be anything you want it to be, but it's better to be descriptive +{ + [HarmonyPrefix] // this isn't needed if the function name is Prefix + public static bool Prefix() // if your function is named Prefix harmony will interpret it as such, if not you need the aformentioned tag. Prefix can also have a return type of void + { + Console.WriteLine("Foobar"); + return true; + } +} +``` +With our new patch in place Foobar is printed then Bar is printed, however if we didn't want Bar to be printed we could return false and harmony wouldn't run the patched function, only our code. + +# Postfix +Postfix happens after a function is called, let's take the example code from Prefix, but now we want Foobar to be printed after Foo. That'd be done with the following code. +```cs +[HarmonyPatch(typeof(Bar), "Foo")] // the first argument is the class type, and the second is the name of the function, note that using nameof(class.function) would also work +public class Patch_Foo // the name can be anything you want it to be, but it's better to be descriptive +{ + [HarmonyPostfix] // this isn't needed if the function name is Postfix + public static void Postfix() + { + Console.WriteLine("Foobar"); + } +} +``` +This will cause Foobar to be printed after Bar is printed. + +# Modifying or reading a return value +Modifying the return value can be done in both Prefix and Postfix, take this code for example. +```cs +public class MyClass +{ + public static int myMethod(int myInt) + { + return myIntl; + } +} +``` +If we wanted myMethod to return a different value we could do so by adding the parameter ref __result to our patch, the type of result has to match the return value of the class and must contain ref if you want to modify it, if you simply wish to read it then ref isn't necessary. +```cs +[HarmonyPatch(typeof(MyClass), "myMethod")] +public class Patch_MyClass +{ + public static void Postfix(ref int __result) + { + __result = 3; + } +} +``` +With this code, we now return 3. Keep in mind that this code works with prefix as well, however if the original function is ran then the return could be modified. + +# Modifying or reading parameters +Remember the code from the last section, but let's say that we want to read myInt, or modify it, that can be accomplished by adding that as a parameter to our patch. +```cs +[HarmonyPatch(typeof(MyClass), "myMethod")] +public class Patch_MyClass +{ + public static void Postfix(ref int myInt) // ref is required if we want to modify it + { + myInt = 4; + System.out.println(myInt); + } +} +``` + + +# Miscellaneous parameters +__instance can be used in the parameters of your patch to grab the instance of the class that called the function. +__state can be used to pass a variable between Prefix and Postfix between the same patched function. \ No newline at end of file -- GitLab From 243ae431c75d3d6bb0647bb8024e3818739085ca Mon Sep 17 00:00:00 2001 From: "DESKTOP-SM4PJFO\\tempe" Date: Thu, 20 May 2021 21:47:40 -0400 Subject: [PATCH 05/13] Basically completed documentation for mods, fixed my spelling errors, added a section on manually editing json files, fixed outdated information --- creating-a-mod/creating-your-first-mod.md | 6 ++-- creating-a-mod/setup.md | 4 +++ creating-a-mod/step2.md | 1 - creating-a-mod/waiting-for-flight-scene.md | 27 ++++++++++++++++++ creating-a-mod/writing-jsons.md | 18 ++++++++++++ documentation/api/index.md | 2 +- .../api/waiting-for-mission-to-be-reloaded.md | 7 ++++- .../harmony/Traverse-private-fields.md | 4 +-- documentation/harmony/patching.md | 6 ++-- documentation/vtolvr/debug-camera.md | 2 +- images/creating-a-mod/json-example.png | Bin 0 -> 39889 bytes 11 files changed, 65 insertions(+), 12 deletions(-) delete mode 100644 creating-a-mod/step2.md create mode 100644 creating-a-mod/waiting-for-flight-scene.md create mode 100644 creating-a-mod/writing-jsons.md create mode 100644 images/creating-a-mod/json-example.png diff --git a/creating-a-mod/creating-your-first-mod.md b/creating-a-mod/creating-your-first-mod.md index 7c2ecf1..d37a4ea 100644 --- a/creating-a-mod/creating-your-first-mod.md +++ b/creating-a-mod/creating-your-first-mod.md @@ -50,15 +50,15 @@ I haven't gone through this code in detail because this is something people with public override void ModLoaded() { //This is an event the VTOLAPI calls when the game is done loading a scene - VTOLAPI.SceneLoaded += SceneLoaded; + VTOLAPI.SceneLoaded += SceneLoaded; base.ModLoaded(); - Log("HELLO WORLD!!!!!!"); + Log("HELLO WORLD!!!!!!"); // If Log isn't working you can also try Debug.Log, but it's likely your class doesn't inherit from either VTOLMOD or Monobehaviour } ``` # Building the .dll file -Now we have our mod create, we need to create the .dll file. Thankfully this is simple, right clicking on the project and pressing Build. +Now we have our mod create, we need to create the .dll file. Thankfully this is simple, right clicking on the project and pressing Build, or pressing ctrl + shift + b. ![](/images/creating-a-mod/Build-Button.PNG) diff --git a/creating-a-mod/setup.md b/creating-a-mod/setup.md index 2bd11ac..44c08d4 100644 --- a/creating-a-mod/setup.md +++ b/creating-a-mod/setup.md @@ -17,3 +17,7 @@ You don't need Unity, however, if you want to start importing your own assets in ![](/images/creating-a-mod/unity.PNG) Once these are installed, we can next move onto creating a basic mod in Visual Studio. + +# dnSpy (Optional) + +dnSpy is what allows you to look at decompiled code and look at what everythingn does. It's downloadable [here]("https://github.com/dnSpy/dnSpy/releases"). \ No newline at end of file diff --git a/creating-a-mod/step2.md b/creating-a-mod/step2.md deleted file mode 100644 index 796c906..0000000 --- a/creating-a-mod/step2.md +++ /dev/null @@ -1 +0,0 @@ -This is step 2 \ No newline at end of file diff --git a/creating-a-mod/waiting-for-flight-scene.md b/creating-a-mod/waiting-for-flight-scene.md new file mode 100644 index 0000000..5a7f6f8 --- /dev/null +++ b/creating-a-mod/waiting-for-flight-scene.md @@ -0,0 +1,27 @@ +# What is the Flight Scene? +The flight scene is the scene where you can fly your airplane, typically the AV-42C, F/A-26B, or the F45A. It's useful to wait for this scene if you want to only run code when the scene is Active. There are 3 scenes that constitute as a "flight" scene, Akutan, CustomMapBase, and OverCloud_CustomMapBase. + +# How to wait for the flight scene +The first thing you want to do is write a scene loaded function. The SceneLoaded function should look something like this, +```cs + private void SceneChanged(VTOLScenes scenes) // You can name it anything, naming it SceneLoaded will cause unity to call it and could break some things + { + if (scenes == VTOLScenes.Akutan || scenes == VTOLScenes.CustomMapBase || scenes == VTOLScenes.CustomMapBase_OverCloud) // If inside of a scene that you can fly in + { + // Your code here. + } + } +``` +This code will cause what ever is inside of the if statement to be ran when a flightscene Starts, however you this can also cause code to run before objects (like the players vehicle) are loaded in, to combat this we need to write a [coroutine]("https://docs.unity3d.com/Manual/Coroutines.html") to make sure we don't run code before the scene is loaded. +```cs +private IEnumerator waitForLoad() + { + while (VTMapManager.fetch == null || !VTMapManager.fetch.scenarioReady || FlightSceneManager.instance.switchingScene) + { + yield return null; // tells the routine to wait a frame before resuming + } + // your code here + yield break; // stops the routine, this is required at the end of the routine if you don't yield anywhere else, but at that point it might be better to make the return type something else + } +``` +Now all that's left to do is link everything together, in your modloaded function if you place the code `VTOLAPI.SceneLoaded += yourSceneLoadedFunction;`, then whenever the scene is changed your function will be caused, and putting `StartCoroutine(waitFroLoad())` inside the if statement of SceneChanged will cause waitForLoad() to run, now you can run code when the flight scene has loaded. Note that if you want the code to rerun when you will also have to add `VTOLAPI.MissionReloaded += waitForLoead`. \ No newline at end of file diff --git a/creating-a-mod/writing-jsons.md b/creating-a-mod/writing-jsons.md new file mode 100644 index 0000000..625f524 --- /dev/null +++ b/creating-a-mod/writing-jsons.md @@ -0,0 +1,18 @@ +# JSON Files +Json files follow a format that goes `"Key" : "Value",`, the mod loader reads these files in order to know how to interpret the mod and for easy modification of descriptions. This is all supported in the Modloader's mod creator section, but if you want to manually edit the files you can also do it. + +Let's look at an example, from the mod All Equips All Time. +![](/images/creating-a-mod/json-example.png) + +Not all values shown here were written by its creator, but rather by the website after uploading it. There are only a couple values that matter in the JSON, the website will write the rest for you. + +# description +This is self explanitory, what your mod does. +# dll_file +This is what the mod loader will inject, if you have multiple dll files this is the file that contains your `VTOLMOD` class. +# name +This is the name of your mod. +# version +This is the version of your mod. + +Note that most of these fields will be created and editable in the mod loader by using Create A Project. If you want an image to be present in your mod, drop it into the mod folder and name it "preview". It's recommended that the file isn't too big, or the mod might take longer ot load. \ No newline at end of file diff --git a/documentation/api/index.md b/documentation/api/index.md index a3c3a6d..aef3c52 100644 --- a/documentation/api/index.md +++ b/documentation/api/index.md @@ -4,7 +4,7 @@ This is the documentation for the mod loaders API >[!CAUTION] > This is rarely used any more -To find the API all you need to do is get the instance variable from the static class then store that in a variable. Later on, all you have to call is "api" if you want to use a function from the API. +To find the API all you need to do is get the instance variable from the static class then store that in a variable. Later on, all you have to call is "api" if you want to use a function from the API. ```cs private VTOLAPI api; diff --git a/documentation/api/waiting-for-mission-to-be-reloaded.md b/documentation/api/waiting-for-mission-to-be-reloaded.md index 88e5932..d38960b 100644 --- a/documentation/api/waiting-for-mission-to-be-reloaded.md +++ b/documentation/api/waiting-for-mission-to-be-reloaded.md @@ -10,4 +10,9 @@ private void MissionReloaded() { //My Amazing Code to run when the user reloads the mission } -``` \ No newline at end of file +``` +You should also consider waiting for the flightscene to be ready, the following code in an IEnumerator will do that. +```cs +while (VTMapManager.fetch == null || !VTMapManager.fetch.scenarioReady || FlightSceneManager.instance.switchingScene) + yield return null; +``` diff --git a/documentation/harmony/Traverse-private-fields.md b/documentation/harmony/Traverse-private-fields.md index 5b8585c..814aae6 100644 --- a/documentation/harmony/Traverse-private-fields.md +++ b/documentation/harmony/Traverse-private-fields.md @@ -1,6 +1,6 @@ # Traverse Traverse is the class in Harmony that is used to get private variables or functions, a traverse is created as follows. ```cs -Traverse traverse = Traverse.Create(object: objectToTraverse) +Traverse traverse = Traverse.Create(object: objectToTraverse); ``` -After making your traverse, you can read private fields by calling Traverse.Field("yourField").GetValue(), and you can call private functions by doing Traverse.Method("yourmethod").GetValue(), note the return on get value is of type object so you will need to cast it correctly. +After making your traverse, you can read private fields by calling `Traverse.Field("yourField").GetValue()`, and you can call private functions by doing `Traverse.Method("yourmethod").GetValue()`, note the return on get value is of type object so you will need to cast it correctly. diff --git a/documentation/harmony/patching.md b/documentation/harmony/patching.md index 24323fd..ac81d1e 100644 --- a/documentation/harmony/patching.md +++ b/documentation/harmony/patching.md @@ -7,7 +7,7 @@ In your ModLoaded function we will add the following code, if you aren't patchin HarmonyInstance harmonyInstance = HarmonyInstance.Create("YourName.YourMod"); harmonyInstance.PatchAll(Assembly.GetExecutingAssembly()); ``` -This will tell harmony to use our patches that we have created., after this code has been added we can begin to write our patches. All patches have to happen either before or after a function has executed in harmony, the first patch is called Prefix, and is called before a function, and the other patch is called Postfix, and happens after a function has executed. +This will tell harmony to use our patches that we have created., after this code has been added we can begin to write our patches. All patches have to happen either before or after a function has executed in harmony. # Prefix Prefix happens before a function is called, let's take the example code here. @@ -57,7 +57,7 @@ public class MyClass { public static int myMethod(int myInt) { - return myIntl; + return myInt; } } ``` @@ -89,6 +89,6 @@ public class Patch_MyClass ``` -# Miscellaneous parameters +# Miscellaneous parameters for patching __instance can be used in the parameters of your patch to grab the instance of the class that called the function. __state can be used to pass a variable between Prefix and Postfix between the same patched function. \ No newline at end of file diff --git a/documentation/vtolvr/debug-camera.md b/documentation/vtolvr/debug-camera.md index 3be65bf..eaba4b0 100644 --- a/documentation/vtolvr/debug-camera.md +++ b/documentation/vtolvr/debug-camera.md @@ -18,6 +18,6 @@ The game has a debug camera which the developer uses to view around the differen > > h - Enables Head debug (Doesn't seem to work) > -> v - Does a toggle mod (Doesn't seem to work) +> v - Switches camera mode from free to chase and vice versa > > t - Does something called tgtMode (Doesn't seem to do anything) \ No newline at end of file diff --git a/images/creating-a-mod/json-example.png b/images/creating-a-mod/json-example.png new file mode 100644 index 0000000000000000000000000000000000000000..84c60865e5bce015c54505f3f5fa44e8f19b690b GIT binary patch literal 39889 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

Vz&p&?j zZ0wf0C%N-)Emb(T<91)-X8EP>LaGh=-g&Qn`39K6rS{&CSv8aQk;;0GE4o_jqOZ~? z#?F$6)9cF?Yo5P%#+ncgmtw%#;V+H)YnWoPYG~;d(*)?7-Ef z$uTx?%je&HmT)#lKz-|c!T-QQ=y2$ku69`Be6abp%$k|^jxVW{y8rqpY}F9M4<$49 zY?$L8bPFL4ui-)po5bV|X*I?@7XQS)K7y_2VW<(EdT-G-U#keIBk0pt8w#R9i*K@*a91+d#qV!Tk>@Cv0z^)^dW!mq76^c>^`Pgg&e IbxsLQ0JU<+D*ylh literal 0 HcmV?d00001 -- GitLab From e91a9cc20e8b8b5d9b7208d347a5f7e6d7408ec1 Mon Sep 17 00:00:00 2001 From: Kevin Joosten Date: Fri, 21 May 2021 14:00:03 +0000 Subject: [PATCH 06/13] The great spell checking begins. --- creating-a-mod/setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creating-a-mod/setup.md b/creating-a-mod/setup.md index 44c08d4..39277f1 100644 --- a/creating-a-mod/setup.md +++ b/creating-a-mod/setup.md @@ -20,4 +20,4 @@ Once these are installed, we can next move onto creating a basic mod in Visual S # dnSpy (Optional) -dnSpy is what allows you to look at decompiled code and look at what everythingn does. It's downloadable [here]("https://github.com/dnSpy/dnSpy/releases"). \ No newline at end of file +dnSpy is what allows you to look at decompiled code and look at what everything does. It's downloadable [here](https://github.com/dnSpy/dnSpy/releases). \ No newline at end of file -- GitLab From 0ac4a870d9d9ebfe986d4be2159daa1a99dbba4d Mon Sep 17 00:00:00 2001 From: Kevin Joosten Date: Fri, 21 May 2021 14:00:09 +0000 Subject: [PATCH 07/13] The great spell checking begins. --- creating-a-mod/waiting-for-flight-scene.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creating-a-mod/waiting-for-flight-scene.md b/creating-a-mod/waiting-for-flight-scene.md index 5a7f6f8..3d4dc8a 100644 --- a/creating-a-mod/waiting-for-flight-scene.md +++ b/creating-a-mod/waiting-for-flight-scene.md @@ -12,7 +12,7 @@ The first thing you want to do is write a scene loaded function. The SceneLoaded } } ``` -This code will cause what ever is inside of the if statement to be ran when a flightscene Starts, however you this can also cause code to run before objects (like the players vehicle) are loaded in, to combat this we need to write a [coroutine]("https://docs.unity3d.com/Manual/Coroutines.html") to make sure we don't run code before the scene is loaded. +This code will cause whatever is inside of the if statement to be ran when a flightscene starts, however this can also cause code to run before objects (like the player's vehicle) are loaded in, to combat this we need to write a [coroutine]("https://docs.unity3d.com/Manual/Coroutines.html") to make sure we don't run code before the scene is loaded. ```cs private IEnumerator waitForLoad() { -- GitLab From bcd74301f6a23135f5e17a18c9b935d35cbe3c86 Mon Sep 17 00:00:00 2001 From: Kevin Joosten Date: Fri, 21 May 2021 14:00:11 +0000 Subject: [PATCH 08/13] The great spell checking begins. --- creating-a-mod/writing-jsons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creating-a-mod/writing-jsons.md b/creating-a-mod/writing-jsons.md index 625f524..1e5f14f 100644 --- a/creating-a-mod/writing-jsons.md +++ b/creating-a-mod/writing-jsons.md @@ -1,5 +1,5 @@ # JSON Files -Json files follow a format that goes `"Key" : "Value",`, the mod loader reads these files in order to know how to interpret the mod and for easy modification of descriptions. This is all supported in the Modloader's mod creator section, but if you want to manually edit the files you can also do it. +Json files follow a format that goes `"Key" : "Value",`, the ModLoader reads these files in order to know how to interpret the mod and for easy modification of descriptions. This is all supported in the ModLoader's mod creator section, but if you want to manually edit the files you can also do it. Let's look at an example, from the mod All Equips All Time. ![](/images/creating-a-mod/json-example.png) -- GitLab From 7c8bb204fd61c5e08f11f967e02d791d9682cb89 Mon Sep 17 00:00:00 2001 From: Kevin Joosten Date: Fri, 21 May 2021 14:00:14 +0000 Subject: [PATCH 09/13] The great spell checking begins. --- creating-a-mod/writing-jsons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creating-a-mod/writing-jsons.md b/creating-a-mod/writing-jsons.md index 1e5f14f..57336f9 100644 --- a/creating-a-mod/writing-jsons.md +++ b/creating-a-mod/writing-jsons.md @@ -7,7 +7,7 @@ Let's look at an example, from the mod All Equips All Time. Not all values shown here were written by its creator, but rather by the website after uploading it. There are only a couple values that matter in the JSON, the website will write the rest for you. # description -This is self explanitory, what your mod does. +This is self explanatory, what your mod does. # dll_file This is what the mod loader will inject, if you have multiple dll files this is the file that contains your `VTOLMOD` class. # name -- GitLab From f5479fafcf60533c948348f0d48c80a51821c031 Mon Sep 17 00:00:00 2001 From: Kevin Joosten Date: Fri, 21 May 2021 14:00:18 +0000 Subject: [PATCH 10/13] The great spell checking begins. --- creating-a-mod/writing-jsons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creating-a-mod/writing-jsons.md b/creating-a-mod/writing-jsons.md index 57336f9..3b7ff60 100644 --- a/creating-a-mod/writing-jsons.md +++ b/creating-a-mod/writing-jsons.md @@ -9,7 +9,7 @@ Not all values shown here were written by its creator, but rather by the website # description This is self explanatory, what your mod does. # dll_file -This is what the mod loader will inject, if you have multiple dll files this is the file that contains your `VTOLMOD` class. +This is what the ModLoader will inject, if you have multiple dll files this is the file that contains your `VTOLMOD` class. # name This is the name of your mod. # version -- GitLab From 279b9b8124d85ffd799e790d2ab0c262ab95cc00 Mon Sep 17 00:00:00 2001 From: Kevin Joosten Date: Fri, 21 May 2021 14:00:21 +0000 Subject: [PATCH 11/13] The great spell checking begins. --- creating-a-mod/writing-jsons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/creating-a-mod/writing-jsons.md b/creating-a-mod/writing-jsons.md index 3b7ff60..6bcd634 100644 --- a/creating-a-mod/writing-jsons.md +++ b/creating-a-mod/writing-jsons.md @@ -15,4 +15,4 @@ This is the name of your mod. # version This is the version of your mod. -Note that most of these fields will be created and editable in the mod loader by using Create A Project. If you want an image to be present in your mod, drop it into the mod folder and name it "preview". It's recommended that the file isn't too big, or the mod might take longer ot load. \ No newline at end of file +Note that most of these fields will be created and editable in the ModLoader by using Create A Project. If you want an image to be present in your mod, drop it into the mod folder and name it "preview". It's recommended that the file isn't too big, or the mod might take longer to load. \ No newline at end of file -- GitLab From 0fcc6e2639eb9e879673f66f521dc8882527e025 Mon Sep 17 00:00:00 2001 From: "DESKTOP-SM4PJFO\\tempe" Date: Thu, 27 May 2021 13:18:43 -0400 Subject: [PATCH 12/13] made harmony visable --- creating-a-skin/toc.yml | 2 +- documentation/toc.yml | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/creating-a-skin/toc.yml b/creating-a-skin/toc.yml index 9bce036..f7264ae 100644 --- a/creating-a-skin/toc.yml +++ b/creating-a-skin/toc.yml @@ -1,2 +1,2 @@ - name: Getting Started - href: index.md \ No newline at end of file + href: index.md diff --git a/documentation/toc.yml b/documentation/toc.yml index 7085145..58b57a2 100644 --- a/documentation/toc.yml +++ b/documentation/toc.yml @@ -17,14 +17,12 @@ href: api\waiting-for-mission-to-be-reloaded.md - name: Get Users Mods href: api\get-users-mods.md -- name: Harmony Examples +- name: Harmony items: - name: Patching Methods - href: harmony\patching-methods.md - - name: Replacig Methods - href: harmony\replacing-methods.md + href: harmony\patching.md - name: Getting and Setting Private Variables - href: harmony\changing-private-variables.md + href: harmony\Traverse-private-fields.md - name: VTOL VR items: - name: Debug Camera Controls -- GitLab From c8498f31c37eae98c6bb4eb0e99fbb5da987ce21 Mon Sep 17 00:00:00 2001 From: Kevin Joosten Date: Wed, 2 Jun 2021 15:12:55 +0000 Subject: [PATCH 13/13] Apply 1 suggestion(s) to 1 file(s) --- documentation/harmony/patching.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/harmony/patching.md b/documentation/harmony/patching.md index ac81d1e..e6c15ac 100644 --- a/documentation/harmony/patching.md +++ b/documentation/harmony/patching.md @@ -2,7 +2,7 @@ Patching is the process of running code before or after a function, and sometimes even modifying it. Patching is useful to execute your code after a function, or before one if your mod breaks it entirely. Patching can even stop the original method from executing. # Setup -In your ModLoaded function we will add the following code, if you aren't patching and functions this is unnecasarry. +In your ModLoaded function we will add the following code, if you aren't patching and functions this is unnecessary. ```cs HarmonyInstance harmonyInstance = HarmonyInstance.Create("YourName.YourMod"); harmonyInstance.PatchAll(Assembly.GetExecutingAssembly()); -- GitLab