7 Commits
Author SHA1 Message Date
js6pak 2407a99569 2.1.0 2022-12-22 12:55:08 +01:00
js6pak eded2830cc Update to 2022.12.8 2022-12-09 20:48:30 +01:00
js6pak 9ef4bd5dc6 Merge pull request #67 from miniduikboot/fix/cofindgame 2022-12-04 23:07:28 +01:00
miniduikbootandEdward Smale 678730ed0f Fix Game lists not working on legacy mm servers
This happens because InnerNetClient.CoConnect now sets the default
LastDisconnectReason to Unknown instead of ExitGame, which breaks the
public game list screen.

Co-Authored-By: Edward Smale <essmale2005@gmail.com>
2022-12-02 19:33:58 +01:00
js6pak da20e0990e Fix occasional NRE 2022-10-27 11:42:17 +02:00
js6pak 9246458919 Kick for not having reactor only when necessary 2022-10-27 11:41:41 +02:00
js6pak fa4cc03e33 Don't send chat messages if quick chat only is enabled 2022-10-27 11:31:45 +02:00
24 changed files with 173 additions and 911 deletions

No files matched your search

+2 -2
View File
@@ -1,7 +1,7 @@
<Project>
<ItemGroup>
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.662" Private="false" ExcludeAssets="runtime;native" />
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2022.10.25" PrivateAssets="all" />
<PackageReference Include="BepInEx.Unity.IL2CPP" Version="6.0.0-be.663" Private="false" ExcludeAssets="runtime;native" />
<PackageReference Include="AmongUs.GameLibs.Steam" Version="2022.12.8" PrivateAssets="all" />
<PackageReference Include="BepInEx.AutoPlugin" Version="1.1.0" PrivateAssets="all" />
<PackageReference Include="BepInEx.IL2CPP.MSBuild" Version="2.0.1" PrivateAssets="all" ExcludeAssets="runtime" />
+1 -1
View File
@@ -8,7 +8,7 @@
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
<VersionPrefix>2.0.0</VersionPrefix>
<VersionPrefix>2.1.0</VersionPrefix>
<VersionSuffix>dev</VersionSuffix>
<Authors>NuclearPowered</Authors>
+31 -54
View File
@@ -4,9 +4,9 @@
"net6.0": {
"AmongUs.GameLibs.Steam": {
"type": "Direct",
"requested": "[2022.10.25, )",
"resolved": "2022.10.25",
"contentHash": "PWgkH/VvMlShVhZB8G432q0tnMaNVZrbIdbEMCZN/fETUlT/ch+qQj4PdTcZhPHREbnJHH3ijHxlca1d7QMBcQ=="
"requested": "[2022.12.8, )",
"resolved": "2022.12.8",
"contentHash": "IJsIi89xUYRvA54YtNVEJjf25hhF3LWzkNBslKCNDUpL1aQ/PhNyO4j18pO71DCgW/qr1P1j8+CwByuBLsInNA=="
},
"BenchmarkDotNet": {
"type": "Direct",
@@ -42,17 +42,17 @@
},
"BepInEx.Unity.IL2CPP": {
"type": "Direct",
"requested": "[6.0.0-be.662, )",
"resolved": "6.0.0-be.662",
"contentHash": "fn7jQ88IBmjssoY9XjGBTg3cULkS+N/le/eUijYf2VV8raWok/6cU/GbU9bejkJS8g+2MvzIwnROAhAxvrGI2Q==",
"requested": "[6.0.0-be.663, )",
"resolved": "6.0.0-be.663",
"contentHash": "J+mZ4svyTt4ZYbUoPwpVtF5QCGfzC42VuYJ7z1K6Qt8YlBEZx3rnmUmaEnoJIqN5wN7BSnQgzEmrRfdbrgtTnA==",
"dependencies": {
"BepInEx.Core": "6.0.0-be.662",
"BepInEx.Unity.Common": "6.0.0-be.662",
"HarmonyX": "2.10.0",
"BepInEx.Core": "6.0.0-be.663",
"BepInEx.Unity.Common": "6.0.0-be.663",
"HarmonyX": "2.10.1",
"Iced": "1.17.0",
"Il2CppInterop.Generator": "1.3.0",
"Il2CppInterop.HarmonySupport": "1.3.0",
"Il2CppInterop.Runtime": "1.3.0",
"Il2CppInterop.Generator": "1.4.0",
"Il2CppInterop.HarmonySupport": "1.4.0",
"Il2CppInterop.Runtime": "1.4.0",
"MonoMod.RuntimeDetour": "22.5.1.1",
"Samboy063.Cpp2IL.Core": "2022.0.7.2"
}
@@ -78,18 +78,18 @@
},
"BepInEx.Core": {
"type": "Transitive",
"resolved": "6.0.0-be.662",
"contentHash": "VVBeCD/KQVy0/TK3V6SD8QZ/es35Xb1mEz/+PbBs3ST1yUC1r7k2JOymhSnmghVqf6UsvlMglOO9pljqhuE/Pw==",
"resolved": "6.0.0-be.663",
"contentHash": "yTlqwieyV3FCzSo4tfiIlS7pTqVtEZwrwHnograkWO4loECeYpShcpoCoxnhQ0vkWsnWGThMK7NodHhjZ+jQDA==",
"dependencies": {
"HarmonyX": "2.10.0",
"HarmonyX": "2.10.1",
"MonoMod.Utils": "22.5.1.1",
"SemanticVersioning": "2.0.2"
}
},
"BepInEx.Unity.Common": {
"type": "Transitive",
"resolved": "6.0.0-be.662",
"contentHash": "BgETw6+snwY//3xjQxLiiEAFRmXaMTcSkg+1UQz6fVBG0YA5Usm/m4GflhTc3nwF61KO3Iznn1AORi5CwLJoUw==",
"resolved": "6.0.0-be.663",
"contentHash": "kxv0yXJQ7YPzUQzlwkpVzmTkdd87kVcQhMjkrwqpowJ0Yx5vEwPUrRyG/pwMH5/cK+2WHCn/2akGWrW0C4vUAQ==",
"dependencies": {
"AssetRipper.VersionUtilities": "1.2.1",
"MonoMod.Utils": "22.5.1.1"
@@ -102,8 +102,8 @@
},
"HarmonyX": {
"type": "Transitive",
"resolved": "2.10.0",
"contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==",
"resolved": "2.10.1",
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
"dependencies": {
"MonoMod.RuntimeDetour": "22.3.23.4",
"System.Reflection.Emit": "4.7.0"
@@ -116,8 +116,8 @@
},
"Il2CppInterop.Common": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "IR3BrZXvL2nvJAn4pruPMgC78Y87hVa5xTYZCuHN67OzRD6WDl5dTO55vtvTl8dXFALKvlN+spja2tXhVuquOw==",
"resolved": "1.4.0",
"contentHash": "xl60qoa1nImG6qgOQcjSDW46nLQHoRvSWE7QTDQz7XeMsGwOxAbgDtOvJ4gOvoLijTU79gFZYe8H1CM7TcTQ5g==",
"dependencies": {
"Iced": "1.17.0",
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
@@ -126,29 +126,29 @@
},
"Il2CppInterop.Generator": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "FuhPxbh/K4K94U3xac/ClMaaBp+MZ4aIaqi5dR0QihyGQoombT+OM/A22RwAIzbaCTbFbvabWaAuOSgB69ZwWQ==",
"resolved": "1.4.0",
"contentHash": "Q4QqkwQroDwwqB17/DRF6hbHQRIuyLksgxVUEDvXZ3T+ogkrZB9h0Ev36alN0f6e7fcZPRkMrpXOAYwZzPiZag==",
"dependencies": {
"Il2CppInterop.Common": "1.3.0",
"Il2CppInterop.Common": "1.4.0",
"Mono.Cecil": "0.11.3"
}
},
"Il2CppInterop.HarmonySupport": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "VppBnXtbMNGFhX8a1gg/85E883t2pW/+FZyV7eOaOXMNQyorg++u+kUFOIYwNpzTVqxWmMeoPS0DH0toVpjoKA==",
"resolved": "1.4.0",
"contentHash": "Uz4w5PbQ3kLXqUrsQxR35f7xMpfnxLiXthVtNaT3fvHXC8B7arjuBZXeCbcozr6dXFJBDa5W0EElBmH0fWoASg==",
"dependencies": {
"HarmonyX": "2.10.0",
"Il2CppInterop.Runtime": "1.3.0"
"Il2CppInterop.Runtime": "1.4.0"
}
},
"Il2CppInterop.Runtime": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "8A+N2yvja960Ap+s2RpW7Nb6HSpyuXJy2ipIlU+1erYU9SWHMyU9JZzUZGOhwWXJChKGvRmDdTZAg12k1+72dg==",
"resolved": "1.4.0",
"contentHash": "ScgsFlbJ3gj5f69As/GT8pSO2WlS7cOeS/n3h4gBqJ01Eq/Lm+s3FBrGpEiuIWALOgmtQYimhjWVpxRt7LYtGw==",
"dependencies": {
"Iced": "1.17.0",
"Il2CppInterop.Common": "1.3.0"
"Il2CppInterop.Common": "1.4.0"
}
},
"IndexRange": {
@@ -161,28 +161,6 @@
"resolved": "2.1.0",
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
},
"Linguini.Bundle": {
"type": "Transitive",
"resolved": "0.3.1",
"contentHash": "k3D0IBSsS91T0G9rYACRYtAS27NDTGz4T3ygHhbhaFdA9i3cCfCpR39MqYEpoA1Ark3lzmvklHePmRCX5EQi1A==",
"dependencies": {
"Linguini.Shared": "0.3.0",
"Linguini.Syntax": "0.3.0"
}
},
"Linguini.Shared": {
"type": "Transitive",
"resolved": "0.3.0",
"contentHash": "rEYA9jWU1Nc9iDuPKar+4IVXjFbGrcNyYZCeU6hiWQoS4nA2UecHu36Rp4bxzasvRGda4FB2JZqty75m4e26VQ=="
},
"Linguini.Syntax": {
"type": "Transitive",
"resolved": "0.3.0",
"contentHash": "v8YV3xPFZfP+OSWjMd6yysp+o7cNnQXxq/slN8Yekoi+dFjsTNF0YiQWJIwg1j2FUbs6claJxY9R1FFlc4s6MA==",
"dependencies": {
"Linguini.Shared": "0.3.0"
}
},
"Microsoft.Bcl.AsyncInterfaces": {
"type": "Transitive",
"resolved": "1.1.0",
@@ -1096,8 +1074,7 @@
"reactor": {
"type": "Project",
"dependencies": {
"BepInEx.Unity.IL2CPP": "[6.0.0-be.662, )",
"Linguini.Bundle": "[0.3.1, )"
"BepInEx.Unity.IL2CPP": "[6.0.0-be.663, )"
}
}
}
+2 -1
View File
@@ -1,6 +1,7 @@
using System;
using System.Linq;
using AmongUs.Data;
using AmongUs.GameOptions;
using BepInEx;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
@@ -52,7 +53,7 @@ public partial class DebuggerPlugin : BasePlugin
if (GUILayout.Button("Force game end"))
{
ShipStatus.Instance.enabled = false;
ShipStatus.RpcEndGame(GameOverReason.ImpostorDisconnect, false);
GameManager.Instance.RpcEndGame(GameOverReason.ImpostorDisconnect, false);
}
if (GUILayout.Button("Call a meeting"))
+7 -1
View File
@@ -1,4 +1,5 @@
using System.Linq;
using AmongUs.GameOptions;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Reactor.Utilities;
@@ -35,10 +36,13 @@ internal static class Patches
}
}
[HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.CheckEndCriteria))]
[HarmonyPatch]
[HarmonyPriority(Priority.First)]
public static class CheckEndCriteriaPatch
{
[HarmonyPatch(typeof(LogicGameFlow), nameof(LogicGameFlow.CheckEndCriteria))]
[HarmonyPatch(typeof(LogicGameFlowNormal), nameof(LogicGameFlow.CheckEndCriteria))]
[HarmonyPatch(typeof(LogicGameFlowHnS), nameof(LogicGameFlow.CheckEndCriteria))]
public static bool Prefix()
{
return !PluginSingleton<DebuggerPlugin>.Instance.Component.DisableGameEnd;
@@ -61,6 +65,8 @@ internal static class Patches
{
public static void Postfix(GameOptionsMenu __instance)
{
if (GameOptionsManager.Instance.CurrentGameOptions.GameMode != GameModes.Normal) return;
__instance.Children
.Single(o => o.Title == StringNames.GameNumImpostors)
.Cast<NumberOption>()
+31 -54
View File
@@ -4,9 +4,9 @@
"net6.0": {
"AmongUs.GameLibs.Steam": {
"type": "Direct",
"requested": "[2022.10.25, )",
"resolved": "2022.10.25",
"contentHash": "PWgkH/VvMlShVhZB8G432q0tnMaNVZrbIdbEMCZN/fETUlT/ch+qQj4PdTcZhPHREbnJHH3ijHxlca1d7QMBcQ=="
"requested": "[2022.12.8, )",
"resolved": "2022.12.8",
"contentHash": "IJsIi89xUYRvA54YtNVEJjf25hhF3LWzkNBslKCNDUpL1aQ/PhNyO4j18pO71DCgW/qr1P1j8+CwByuBLsInNA=="
},
"BepInEx.AutoPlugin": {
"type": "Direct",
@@ -22,17 +22,17 @@
},
"BepInEx.Unity.IL2CPP": {
"type": "Direct",
"requested": "[6.0.0-be.662, )",
"resolved": "6.0.0-be.662",
"contentHash": "fn7jQ88IBmjssoY9XjGBTg3cULkS+N/le/eUijYf2VV8raWok/6cU/GbU9bejkJS8g+2MvzIwnROAhAxvrGI2Q==",
"requested": "[6.0.0-be.663, )",
"resolved": "6.0.0-be.663",
"contentHash": "J+mZ4svyTt4ZYbUoPwpVtF5QCGfzC42VuYJ7z1K6Qt8YlBEZx3rnmUmaEnoJIqN5wN7BSnQgzEmrRfdbrgtTnA==",
"dependencies": {
"BepInEx.Core": "6.0.0-be.662",
"BepInEx.Unity.Common": "6.0.0-be.662",
"HarmonyX": "2.10.0",
"BepInEx.Core": "6.0.0-be.663",
"BepInEx.Unity.Common": "6.0.0-be.663",
"HarmonyX": "2.10.1",
"Iced": "1.17.0",
"Il2CppInterop.Generator": "1.3.0",
"Il2CppInterop.HarmonySupport": "1.3.0",
"Il2CppInterop.Runtime": "1.3.0",
"Il2CppInterop.Generator": "1.4.0",
"Il2CppInterop.HarmonySupport": "1.4.0",
"Il2CppInterop.Runtime": "1.4.0",
"MonoMod.RuntimeDetour": "22.5.1.1",
"Samboy063.Cpp2IL.Core": "2022.0.7.2"
}
@@ -53,18 +53,18 @@
},
"BepInEx.Core": {
"type": "Transitive",
"resolved": "6.0.0-be.662",
"contentHash": "VVBeCD/KQVy0/TK3V6SD8QZ/es35Xb1mEz/+PbBs3ST1yUC1r7k2JOymhSnmghVqf6UsvlMglOO9pljqhuE/Pw==",
"resolved": "6.0.0-be.663",
"contentHash": "yTlqwieyV3FCzSo4tfiIlS7pTqVtEZwrwHnograkWO4loECeYpShcpoCoxnhQ0vkWsnWGThMK7NodHhjZ+jQDA==",
"dependencies": {
"HarmonyX": "2.10.0",
"HarmonyX": "2.10.1",
"MonoMod.Utils": "22.5.1.1",
"SemanticVersioning": "2.0.2"
}
},
"BepInEx.Unity.Common": {
"type": "Transitive",
"resolved": "6.0.0-be.662",
"contentHash": "BgETw6+snwY//3xjQxLiiEAFRmXaMTcSkg+1UQz6fVBG0YA5Usm/m4GflhTc3nwF61KO3Iznn1AORi5CwLJoUw==",
"resolved": "6.0.0-be.663",
"contentHash": "kxv0yXJQ7YPzUQzlwkpVzmTkdd87kVcQhMjkrwqpowJ0Yx5vEwPUrRyG/pwMH5/cK+2WHCn/2akGWrW0C4vUAQ==",
"dependencies": {
"AssetRipper.VersionUtilities": "1.2.1",
"MonoMod.Utils": "22.5.1.1"
@@ -72,8 +72,8 @@
},
"HarmonyX": {
"type": "Transitive",
"resolved": "2.10.0",
"contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==",
"resolved": "2.10.1",
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
"dependencies": {
"MonoMod.RuntimeDetour": "22.3.23.4",
"System.Reflection.Emit": "4.7.0"
@@ -86,8 +86,8 @@
},
"Il2CppInterop.Common": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "IR3BrZXvL2nvJAn4pruPMgC78Y87hVa5xTYZCuHN67OzRD6WDl5dTO55vtvTl8dXFALKvlN+spja2tXhVuquOw==",
"resolved": "1.4.0",
"contentHash": "xl60qoa1nImG6qgOQcjSDW46nLQHoRvSWE7QTDQz7XeMsGwOxAbgDtOvJ4gOvoLijTU79gFZYe8H1CM7TcTQ5g==",
"dependencies": {
"Iced": "1.17.0",
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
@@ -96,29 +96,29 @@
},
"Il2CppInterop.Generator": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "FuhPxbh/K4K94U3xac/ClMaaBp+MZ4aIaqi5dR0QihyGQoombT+OM/A22RwAIzbaCTbFbvabWaAuOSgB69ZwWQ==",
"resolved": "1.4.0",
"contentHash": "Q4QqkwQroDwwqB17/DRF6hbHQRIuyLksgxVUEDvXZ3T+ogkrZB9h0Ev36alN0f6e7fcZPRkMrpXOAYwZzPiZag==",
"dependencies": {
"Il2CppInterop.Common": "1.3.0",
"Il2CppInterop.Common": "1.4.0",
"Mono.Cecil": "0.11.3"
}
},
"Il2CppInterop.HarmonySupport": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "VppBnXtbMNGFhX8a1gg/85E883t2pW/+FZyV7eOaOXMNQyorg++u+kUFOIYwNpzTVqxWmMeoPS0DH0toVpjoKA==",
"resolved": "1.4.0",
"contentHash": "Uz4w5PbQ3kLXqUrsQxR35f7xMpfnxLiXthVtNaT3fvHXC8B7arjuBZXeCbcozr6dXFJBDa5W0EElBmH0fWoASg==",
"dependencies": {
"HarmonyX": "2.10.0",
"Il2CppInterop.Runtime": "1.3.0"
"Il2CppInterop.Runtime": "1.4.0"
}
},
"Il2CppInterop.Runtime": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "8A+N2yvja960Ap+s2RpW7Nb6HSpyuXJy2ipIlU+1erYU9SWHMyU9JZzUZGOhwWXJChKGvRmDdTZAg12k1+72dg==",
"resolved": "1.4.0",
"contentHash": "ScgsFlbJ3gj5f69As/GT8pSO2WlS7cOeS/n3h4gBqJ01Eq/Lm+s3FBrGpEiuIWALOgmtQYimhjWVpxRt7LYtGw==",
"dependencies": {
"Iced": "1.17.0",
"Il2CppInterop.Common": "1.3.0"
"Il2CppInterop.Common": "1.4.0"
}
},
"IndexRange": {
@@ -131,28 +131,6 @@
"resolved": "2.1.0",
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
},
"Linguini.Bundle": {
"type": "Transitive",
"resolved": "0.3.1",
"contentHash": "k3D0IBSsS91T0G9rYACRYtAS27NDTGz4T3ygHhbhaFdA9i3cCfCpR39MqYEpoA1Ark3lzmvklHePmRCX5EQi1A==",
"dependencies": {
"Linguini.Shared": "0.3.0",
"Linguini.Syntax": "0.3.0"
}
},
"Linguini.Shared": {
"type": "Transitive",
"resolved": "0.3.0",
"contentHash": "rEYA9jWU1Nc9iDuPKar+4IVXjFbGrcNyYZCeU6hiWQoS4nA2UecHu36Rp4bxzasvRGda4FB2JZqty75m4e26VQ=="
},
"Linguini.Syntax": {
"type": "Transitive",
"resolved": "0.3.0",
"contentHash": "v8YV3xPFZfP+OSWjMd6yysp+o7cNnQXxq/slN8Yekoi+dFjsTNF0YiQWJIwg1j2FUbs6claJxY9R1FFlc4s6MA==",
"dependencies": {
"Linguini.Shared": "0.3.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Transitive",
"resolved": "6.0.1",
@@ -889,8 +867,7 @@
"reactor": {
"type": "Project",
"dependencies": {
"BepInEx.Unity.IL2CPP": "[6.0.0-be.662, )",
"Linguini.Bundle": "[0.3.1, )"
"BepInEx.Unity.IL2CPP": "[6.0.0-be.663, )"
}
}
}
+31 -54
View File
@@ -4,9 +4,9 @@
"net6.0": {
"AmongUs.GameLibs.Steam": {
"type": "Direct",
"requested": "[2022.10.25, )",
"resolved": "2022.10.25",
"contentHash": "PWgkH/VvMlShVhZB8G432q0tnMaNVZrbIdbEMCZN/fETUlT/ch+qQj4PdTcZhPHREbnJHH3ijHxlca1d7QMBcQ=="
"requested": "[2022.12.8, )",
"resolved": "2022.12.8",
"contentHash": "IJsIi89xUYRvA54YtNVEJjf25hhF3LWzkNBslKCNDUpL1aQ/PhNyO4j18pO71DCgW/qr1P1j8+CwByuBLsInNA=="
},
"BepInEx.AutoPlugin": {
"type": "Direct",
@@ -22,17 +22,17 @@
},
"BepInEx.Unity.IL2CPP": {
"type": "Direct",
"requested": "[6.0.0-be.662, )",
"resolved": "6.0.0-be.662",
"contentHash": "fn7jQ88IBmjssoY9XjGBTg3cULkS+N/le/eUijYf2VV8raWok/6cU/GbU9bejkJS8g+2MvzIwnROAhAxvrGI2Q==",
"requested": "[6.0.0-be.663, )",
"resolved": "6.0.0-be.663",
"contentHash": "J+mZ4svyTt4ZYbUoPwpVtF5QCGfzC42VuYJ7z1K6Qt8YlBEZx3rnmUmaEnoJIqN5wN7BSnQgzEmrRfdbrgtTnA==",
"dependencies": {
"BepInEx.Core": "6.0.0-be.662",
"BepInEx.Unity.Common": "6.0.0-be.662",
"HarmonyX": "2.10.0",
"BepInEx.Core": "6.0.0-be.663",
"BepInEx.Unity.Common": "6.0.0-be.663",
"HarmonyX": "2.10.1",
"Iced": "1.17.0",
"Il2CppInterop.Generator": "1.3.0",
"Il2CppInterop.HarmonySupport": "1.3.0",
"Il2CppInterop.Runtime": "1.3.0",
"Il2CppInterop.Generator": "1.4.0",
"Il2CppInterop.HarmonySupport": "1.4.0",
"Il2CppInterop.Runtime": "1.4.0",
"MonoMod.RuntimeDetour": "22.5.1.1",
"Samboy063.Cpp2IL.Core": "2022.0.7.2"
}
@@ -53,18 +53,18 @@
},
"BepInEx.Core": {
"type": "Transitive",
"resolved": "6.0.0-be.662",
"contentHash": "VVBeCD/KQVy0/TK3V6SD8QZ/es35Xb1mEz/+PbBs3ST1yUC1r7k2JOymhSnmghVqf6UsvlMglOO9pljqhuE/Pw==",
"resolved": "6.0.0-be.663",
"contentHash": "yTlqwieyV3FCzSo4tfiIlS7pTqVtEZwrwHnograkWO4loECeYpShcpoCoxnhQ0vkWsnWGThMK7NodHhjZ+jQDA==",
"dependencies": {
"HarmonyX": "2.10.0",
"HarmonyX": "2.10.1",
"MonoMod.Utils": "22.5.1.1",
"SemanticVersioning": "2.0.2"
}
},
"BepInEx.Unity.Common": {
"type": "Transitive",
"resolved": "6.0.0-be.662",
"contentHash": "BgETw6+snwY//3xjQxLiiEAFRmXaMTcSkg+1UQz6fVBG0YA5Usm/m4GflhTc3nwF61KO3Iznn1AORi5CwLJoUw==",
"resolved": "6.0.0-be.663",
"contentHash": "kxv0yXJQ7YPzUQzlwkpVzmTkdd87kVcQhMjkrwqpowJ0Yx5vEwPUrRyG/pwMH5/cK+2WHCn/2akGWrW0C4vUAQ==",
"dependencies": {
"AssetRipper.VersionUtilities": "1.2.1",
"MonoMod.Utils": "22.5.1.1"
@@ -72,8 +72,8 @@
},
"HarmonyX": {
"type": "Transitive",
"resolved": "2.10.0",
"contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==",
"resolved": "2.10.1",
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
"dependencies": {
"MonoMod.RuntimeDetour": "22.3.23.4",
"System.Reflection.Emit": "4.7.0"
@@ -86,8 +86,8 @@
},
"Il2CppInterop.Common": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "IR3BrZXvL2nvJAn4pruPMgC78Y87hVa5xTYZCuHN67OzRD6WDl5dTO55vtvTl8dXFALKvlN+spja2tXhVuquOw==",
"resolved": "1.4.0",
"contentHash": "xl60qoa1nImG6qgOQcjSDW46nLQHoRvSWE7QTDQz7XeMsGwOxAbgDtOvJ4gOvoLijTU79gFZYe8H1CM7TcTQ5g==",
"dependencies": {
"Iced": "1.17.0",
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
@@ -96,29 +96,29 @@
},
"Il2CppInterop.Generator": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "FuhPxbh/K4K94U3xac/ClMaaBp+MZ4aIaqi5dR0QihyGQoombT+OM/A22RwAIzbaCTbFbvabWaAuOSgB69ZwWQ==",
"resolved": "1.4.0",
"contentHash": "Q4QqkwQroDwwqB17/DRF6hbHQRIuyLksgxVUEDvXZ3T+ogkrZB9h0Ev36alN0f6e7fcZPRkMrpXOAYwZzPiZag==",
"dependencies": {
"Il2CppInterop.Common": "1.3.0",
"Il2CppInterop.Common": "1.4.0",
"Mono.Cecil": "0.11.3"
}
},
"Il2CppInterop.HarmonySupport": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "VppBnXtbMNGFhX8a1gg/85E883t2pW/+FZyV7eOaOXMNQyorg++u+kUFOIYwNpzTVqxWmMeoPS0DH0toVpjoKA==",
"resolved": "1.4.0",
"contentHash": "Uz4w5PbQ3kLXqUrsQxR35f7xMpfnxLiXthVtNaT3fvHXC8B7arjuBZXeCbcozr6dXFJBDa5W0EElBmH0fWoASg==",
"dependencies": {
"HarmonyX": "2.10.0",
"Il2CppInterop.Runtime": "1.3.0"
"Il2CppInterop.Runtime": "1.4.0"
}
},
"Il2CppInterop.Runtime": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "8A+N2yvja960Ap+s2RpW7Nb6HSpyuXJy2ipIlU+1erYU9SWHMyU9JZzUZGOhwWXJChKGvRmDdTZAg12k1+72dg==",
"resolved": "1.4.0",
"contentHash": "ScgsFlbJ3gj5f69As/GT8pSO2WlS7cOeS/n3h4gBqJ01Eq/Lm+s3FBrGpEiuIWALOgmtQYimhjWVpxRt7LYtGw==",
"dependencies": {
"Iced": "1.17.0",
"Il2CppInterop.Common": "1.3.0"
"Il2CppInterop.Common": "1.4.0"
}
},
"IndexRange": {
@@ -131,28 +131,6 @@
"resolved": "2.1.0",
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
},
"Linguini.Bundle": {
"type": "Transitive",
"resolved": "0.3.1",
"contentHash": "k3D0IBSsS91T0G9rYACRYtAS27NDTGz4T3ygHhbhaFdA9i3cCfCpR39MqYEpoA1Ark3lzmvklHePmRCX5EQi1A==",
"dependencies": {
"Linguini.Shared": "0.3.0",
"Linguini.Syntax": "0.3.0"
}
},
"Linguini.Shared": {
"type": "Transitive",
"resolved": "0.3.0",
"contentHash": "rEYA9jWU1Nc9iDuPKar+4IVXjFbGrcNyYZCeU6hiWQoS4nA2UecHu36Rp4bxzasvRGda4FB2JZqty75m4e26VQ=="
},
"Linguini.Syntax": {
"type": "Transitive",
"resolved": "0.3.0",
"contentHash": "v8YV3xPFZfP+OSWjMd6yysp+o7cNnQXxq/slN8Yekoi+dFjsTNF0YiQWJIwg1j2FUbs6claJxY9R1FFlc4s6MA==",
"dependencies": {
"Linguini.Shared": "0.3.0"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "Transitive",
"resolved": "6.0.1",
@@ -889,8 +867,7 @@
"reactor": {
"type": "Project",
"dependencies": {
"BepInEx.Unity.IL2CPP": "[6.0.0-be.662, )",
"Linguini.Bundle": "[0.3.1, )"
"BepInEx.Unity.IL2CPP": "[6.0.0-be.663, )"
}
}
}
@@ -1,36 +0,0 @@
using System.Text;
using System.Text.RegularExpressions;
using Linguini.Syntax.Ast;
namespace Reactor.Linguinitor;
internal static class FluentCommentParser
{
private static readonly Regex _variableCommentRegex = new(@"^\$(?<id>[\w-]+) \((?<type>String|Number|Date)\)( - (?<description>.+))?$", RegexOptions.Compiled);
public static MessageInfo Parse(AstComment astComment)
{
var descriptionBuilder = new StringBuilder();
var variables = new Dictionary<string, VariableInfo>();
foreach (var s in astComment.AsStr().Split("\n"))
{
var line = s.Trim();
if (_variableCommentRegex.Match(line) is { Success: true } match)
{
variables.Add(match.Groups["id"].Value, new VariableInfo(match.Groups["type"].Value, match.Groups["description"].Value));
}
else
{
descriptionBuilder.AppendLine(line);
}
}
return new MessageInfo(descriptionBuilder.ToString(), variables);
}
public record MessageInfo(string Description, Dictionary<string, VariableInfo> Variables);
public record VariableInfo(string Type, string? Description);
}
-166
View File
@@ -1,166 +0,0 @@
using CSharpPoet;
using Linguini.Syntax.Ast;
using Linguini.Syntax.Parser;
using Microsoft.CodeAnalysis;
namespace Reactor.Linguinitor;
[Generator(LanguageNames.CSharp)]
public class LinguinitorGenerator : IIncrementalGenerator
{
private static CSharpFile CreateTranslateFile(string @namespace, params CSharpType.IMember[] members)
{
return new CSharpFile(@namespace)
{
new CSharpClass(Visibility.Internal, "Translate")
{
IsStatic = true,
IsPartial = true,
Members = members,
},
};
}
private static IEnumerable<Identifier> GetVariables(AstMessage astMessage)
{
foreach (var placeable in astMessage.Value!.Elements.OfType<Placeable>())
{
switch (placeable.Expression)
{
case VariableReference variableReference:
yield return variableReference.Id;
break;
}
}
}
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var rootNamespaceProvider =
context.AnalyzerConfigOptionsProvider
.Select((options, _) => options.GlobalOptions.TryGetValue("build_property.RootNamespace", out var rootNamespace) ? rootNamespace : throw new InvalidOperationException("Failed to get RootNamespace"));
context.RegisterSourceOutput(rootNamespaceProvider, (spc, rootNamespace) =>
{
const string ProviderType = "Reactor.Localization.Providers.FluentLocalizationProvider";
spc.AddSource("Translate", CreateTranslateFile(
rootNamespace,
new CSharpField(Visibility.Private, ProviderType + "?", "_provider") { IsStatic = true },
new CSharpProperty(ProviderType, "Provider")
{
IsStatic = true,
Getter = new CSharpProperty.Accessor
{
Body = writer => writer.Write("_provider ?? throw new System.InvalidOperationException(\"Provider must be set before using Translate\");"),
},
Setter = new CSharpProperty.Accessor
{
Body = writer => writer.Write("_provider = value;"),
},
}
).ToString());
});
var textFiles = context.AdditionalTextsProvider.Where(static file => file.Path.EndsWith(".ftl", StringComparison.Ordinal));
var namesAndContents = textFiles.Select((text, cancellationToken) => (
Name: Path.GetFileNameWithoutExtension(text.Path),
Content: text.GetText(cancellationToken)!.ToString()
));
context.RegisterSourceOutput(namesAndContents.Combine(rootNamespaceProvider), (spc, pair) =>
{
var ((name, content), rootNamespace) = pair;
var fixedName = name.ToPascalCase();
var idsClass = new CSharpClass("Ids")
{
IsStatic = true,
};
var fileClass = new CSharpClass(fixedName)
{
IsStatic = true,
Members = { idsClass },
};
var resource = new LinguiniParser(content).ParseWithComments();
foreach (var message in resource.Entries.OfType<AstMessage>())
{
var id = message.GetId();
var fixedId = id.ToPascalCase();
idsClass.Members.Add(new CSharpField(Visibility.Public, "string", fixedId)
{
IsConst = true,
DefaultValue = $"\"{id}\"",
});
var messageInfo = message.Comment != null ? FluentCommentParser.Parse(message.Comment) : null;
var variables = GetVariables(message).Select(m => m.ToString()).ToDictionary(
m => m,
m =>
{
if (messageInfo != null && messageInfo.Variables.TryGetValue(m, out var variableInfo))
{
return variableInfo.Type switch
{
"String" => "string",
"Number" => "double",
_ => throw new NotSupportedException($"Variable type {variableInfo.Type} is not supported"),
};
}
return "string";
}
);
void WriteComment(CodeWriter writer)
{
if (messageInfo == null) return;
writer.WriteLine("<summary>");
foreach (var line in messageInfo.Description.Trim().Split("\n"))
{
writer.WriteLine(line);
}
writer.WriteLine("</summary>");
foreach (var (variableId, info) in messageInfo.Variables)
{
writer.WriteLine($"<param name=\"{variableId}\">{info.Description}</param>");
}
}
if (variables.Count <= 0)
{
fileClass.Members.Add(new CSharpProperty("string", fixedId)
{
XmlComment = WriteComment,
IsStatic = true,
Getter = new CSharpProperty.Accessor
{
Body = writer => writer.Write($"Provider.GetText(Ids.{fixedId});"),
},
});
}
else
{
fileClass.Members.Add(new CSharpMethod("string", fixedId)
{
XmlComment = WriteComment,
IsStatic = true,
Parameters = variables.Select(v => new CSharpParameter(v.Value, v.Key)).ToArray(),
BodyType = BodyType.Expression,
Body = writer => writer.WriteLine($"Provider.GetText(Ids.{fixedId}, {string.Join(", ", variables.Select(v => $"(\"{v.Key}\", {v.Key.ToCamelCase()})"))});"),
});
}
}
spc.AddSource("Translate." + fixedName, CreateTranslateFile(rootNamespace, fileClass).ToString());
});
}
}
@@ -1,35 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0;net472</TargetFrameworks>
<LangVersion>latest</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<EnableDynamicLoading>true</EnableDynamicLoading>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CSharpPoet" Version="0.2.0-dev" Private="true" GeneratePathProperty="true" />
<PackageReference Include="Linguini.Shared" Version="0.3.0" Private="true" GeneratePathProperty="true" />
<PackageReference Include="Linguini.Syntax" Version="0.3.0" Private="true" GeneratePathProperty="true" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.3.1" PrivateAssets="all" />
</ItemGroup>
<PropertyGroup>
<GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
</PropertyGroup>
<Target Name="GetDependencyTargetPaths">
<PropertyGroup>
<_LinguiniTargetFramework Condition="'$(TargetFramework)' == 'net6.0'">netstandard2.1</_LinguiniTargetFramework>
<_LinguiniTargetFramework Condition="'$(TargetFramework)' == 'net472'">net451</_LinguiniTargetFramework>
</PropertyGroup>
<ItemGroup>
<TargetPathWithTargetPlatformMoniker Include="$(PkgCSharpPoet)\lib\netstandard2.0\CSharpPoet.dll" IncludeRuntimeDependency="false" />
<TargetPathWithTargetPlatformMoniker Include="$(PkgLinguini_Shared)\lib\$(_LinguiniTargetFramework)\Linguini.Shared.dll" IncludeRuntimeDependency="false" />
<TargetPathWithTargetPlatformMoniker Include="$(PkgLinguini_Syntax)\lib\$(_LinguiniTargetFramework)\Linguini.Syntax.dll" IncludeRuntimeDependency="false" />
</ItemGroup>
</Target>
</Project>
-38
View File
@@ -1,38 +0,0 @@
using System.Text;
namespace Reactor.Linguinitor;
internal static class StringExtensions
{
private static string ToCase(this string value, bool capitalizeFirst)
{
var stringBuilder = new StringBuilder();
for (var i = 0; i < value.Length; i++)
{
var c = value[i];
if (c == '-')
{
i++;
stringBuilder.Append(char.ToUpperInvariant(value[i]));
}
else
{
stringBuilder.Append(capitalizeFirst && i == 0 ? char.ToUpperInvariant(c) : c);
}
}
return stringBuilder.ToString();
}
public static string ToPascalCase(this string value)
{
return value.ToCase(true);
}
public static string ToCamelCase(this string value)
{
return value.ToCase(false);
}
}
-105
View File
@@ -1,105 +0,0 @@
{
"version": 1,
"dependencies": {
"net6.0": {
"CSharpPoet": {
"type": "Direct",
"requested": "[0.2.0-dev, )",
"resolved": "0.2.0-dev"
},
"Linguini.Shared": {
"type": "Direct",
"requested": "[0.3.0, )",
"resolved": "0.3.0",
"contentHash": "rEYA9jWU1Nc9iDuPKar+4IVXjFbGrcNyYZCeU6hiWQoS4nA2UecHu36Rp4bxzasvRGda4FB2JZqty75m4e26VQ=="
},
"Linguini.Syntax": {
"type": "Direct",
"requested": "[0.3.0, )",
"resolved": "0.3.0",
"contentHash": "v8YV3xPFZfP+OSWjMd6yysp+o7cNnQXxq/slN8Yekoi+dFjsTNF0YiQWJIwg1j2FUbs6claJxY9R1FFlc4s6MA==",
"dependencies": {
"Linguini.Shared": "0.3.0"
}
},
"Microsoft.CodeAnalysis.CSharp": {
"type": "Direct",
"requested": "[4.3.1, )",
"resolved": "4.3.1",
"contentHash": "5C9VHvahL98tumlyaT/loB5rW+K/6q0UU7uLyT1Dv15YjZraRkqML9u2t2e8GaO7XqEOtBVqK/SlxXOPqwzxog==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "[4.3.1]"
}
},
"StyleCop.Analyzers": {
"type": "Direct",
"requested": "[1.2.0-beta.435, )",
"resolved": "1.2.0-beta.435",
"contentHash": "TADk7vdGXtfTnYCV7GyleaaRTQjfoSfZXprQrVMm7cSJtJbFc1QIbWPyLvrgrfGdfHbGmUPvaN4ODKNxg2jgPQ==",
"dependencies": {
"StyleCop.Analyzers.Unstable": "1.2.0.435"
}
},
"Microsoft.CodeAnalysis.Analyzers": {
"type": "Transitive",
"resolved": "3.3.3",
"contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ=="
},
"Microsoft.CodeAnalysis.Common": {
"type": "Transitive",
"resolved": "4.3.1",
"contentHash": "wexpJffSEEwptwe6UTMxRDZCCtz+XubI4Qewl4JECnNhcQrtb0anhSUEV9Nz7WkoNfWkx1fptR8xh1egoxYrqw==",
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.3.3",
"System.Collections.Immutable": "6.0.0",
"System.Memory": "4.5.4",
"System.Reflection.Metadata": "5.0.0",
"System.Runtime.CompilerServices.Unsafe": "6.0.0",
"System.Text.Encoding.CodePages": "6.0.0",
"System.Threading.Tasks.Extensions": "4.5.4"
}
},
"StyleCop.Analyzers.Unstable": {
"type": "Transitive",
"resolved": "1.2.0.435",
"contentHash": "ouwPWZxbOV3SmCZxIRqHvljkSzkCyi1tDoMzQtDb/bRP8ctASV/iRJr+A2Gdj0QLaLmWnqTWDrH82/iP+X80Lg=="
},
"System.Collections.Immutable": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==",
"dependencies": {
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"System.Memory": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw=="
},
"System.Reflection.Metadata": {
"type": "Transitive",
"resolved": "5.0.0",
"contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
},
"System.Runtime.CompilerServices.Unsafe": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg=="
},
"System.Text.Encoding.CodePages": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==",
"dependencies": {
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"System.Threading.Tasks.Extensions": {
"type": "Transitive",
"resolved": "4.5.4",
"contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg=="
}
}
}
}
-6
View File
@@ -18,8 +18,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Files", "Solution
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Networking.Shared", "Reactor.Networking.Shared\Reactor.Networking.Shared.csproj", "{1E68CA20-22EB-4E57-B525-81970BE6363D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Reactor.Linguinitor", "Reactor.Linguinitor\Reactor.Linguinitor.csproj", "{B4740F75-B657-4515-A8F6-8A84D64E8814}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -46,10 +44,6 @@ Global
{1E68CA20-22EB-4E57-B525-81970BE6363D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1E68CA20-22EB-4E57-B525-81970BE6363D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E68CA20-22EB-4E57-B525-81970BE6363D}.Release|Any CPU.Build.0 = Release|Any CPU
{B4740F75-B657-4515-A8F6-8A84D64E8814}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B4740F75-B657-4515-A8F6-8A84D64E8814}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B4740F75-B657-4515-A8F6-8A84D64E8814}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B4740F75-B657-4515-A8F6-8A84D64E8814}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
EndGlobalSection
@@ -1,10 +0,0 @@
-for-more-info-see = For more info see https://reactor.gg/handshake
vanilla-server-warning =
This server doesn't support Reactor protocol.
The lobbies shown may not be compatible with your current mods.
{ -for-more-info-see }
public-lobby-warning =
You can't make public lobbies on servers that don't support Reactor protocol.
{ -for-more-info-see }
@@ -1,10 +0,0 @@
-for-more-info-see = Voor meer informatie, zie https://reactor.gg/handshake
vanilla-server-warning =
Deze server ondersteunt het Reactor protocol niet.
De lobbies die je ziet passen mogelijk niet bij jouw huidige mods.
{ -for-more-info-see }
public-lobby-warning =
Je kan geen publieke lobbies maken op servers die het Reactor protocol niet ondersteunen.
{ -for-more-info-see }
@@ -1,10 +0,0 @@
-for-more-info-see = Dla więcej informacji, zobacz https://reactor.gg/handshake
vanilla-server-warning =
Ten serwer nie wspiera protokołu Reactor.
Pokazane gry mogą nie być kompatibline z twoimi modami.
{ -for-more-info-see }
public-lobby-warning =
Nie możesz tworzyć publicznych gier w serwerach, które nie wspierają protokołu Reactor.
{ -for-more-info-see }
@@ -1,258 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Linguini.Bundle;
using Linguini.Bundle.Builder;
using Linguini.Bundle.Errors;
using Linguini.Shared.Types.Bundle;
using Linguini.Syntax.Ast;
using Reactor.Localization.Extensions;
using Reactor.Localization.Utilities;
using Reactor.Utilities;
using Object = Il2CppSystem.Object;
namespace Reactor.Localization.Providers;
/// <summary>
/// Represents a localization provider that uses Fluent.
/// </summary>
public class FluentLocalizationProvider : LocalizationProvider
{
private readonly Func<CultureInfo, IEnumerable<Resource>> _loadResources;
private readonly List<FluentBundle> _bundles = new();
private readonly Dictionary<StringNames, string> _ids = new();
private readonly Dictionary<StringNames, string[]> _arguments = new();
/// <summary>
/// Gets or sets the fallback language.
/// </summary>
public SupportedLangs FallbackLanguage { get; set; } = SupportedLangs.English;
/// <summary>
/// Initializes a new instance of the <see cref="FluentLocalizationProvider"/> class.
/// </summary>
/// <param name="loadResources">The implementation of resource loading.</param>
public FluentLocalizationProvider(Func<CultureInfo, IEnumerable<Resource>> loadResources)
{
_loadResources = loadResources;
}
/// <summary>
/// Initializes a new instance of the <see cref="FluentLocalizationProvider"/> class that loads resources from the calling assembly.
/// </summary>
/// <param name="prefix">The prefix of resource file names to load.</param>
/// <returns>a <see cref="FluentLocalizationProvider"/>.</returns>
public static FluentLocalizationProvider FromEmbeddedResources(string prefix) => FromEmbeddedResources(Assembly.GetCallingAssembly(), prefix);
/// <summary>
/// Initializes a new instance of the <see cref="FluentLocalizationProvider"/> class that loads resources from the specified <paramref name="assembly"/>.
/// </summary>
/// <param name="assembly">The assembly to load resources from.</param>
/// <param name="prefix">The prefix of resource file names to load.</param>
/// <returns>a <see cref="FluentLocalizationProvider"/>.</returns>
public static FluentLocalizationProvider FromEmbeddedResources(Assembly assembly, string prefix)
{
return new FluentLocalizationProvider(cultureInfo =>
{
return assembly.GetManifestResourceNames()
.Where(n => n.StartsWith($"{prefix}.{cultureInfo.Name}.", StringComparison.Ordinal) && n.EndsWith(".ftl", StringComparison.Ordinal))
.Select(n => (Resource) new StreamReader(assembly.GetManifestResourceStream(n)!));
});
}
/// <summary>
/// Registers a <see cref="StringNames"/> for use with base game apis.
/// </summary>
/// <param name="id">The id of a Fluent message.</param>
/// <returns>A <see cref="StringNames"/>.</returns>
public StringNames Register(string id)
{
var stringNames = CustomStringName.Create();
_ids[stringNames] = id;
return stringNames;
}
/// <summary>
/// Registers a <see cref="StringNames"/> for use with base game apis with overriden format argument names.
/// </summary>
/// <param name="id">The id of a Fluent message.</param>
/// <param name="argumentNames">An array of Fluent variable names in the same order as format arguments.</param>
/// <returns>A <see cref="StringNames"/>.</returns>
public StringNames Register(string id, params string[] argumentNames)
{
var stringNames = Register(id);
_arguments[stringNames] = argumentNames;
return stringNames;
}
/// <inheritdoc/>
public override int Priority => ReactorPriority.Normal;
/// <inheritdoc />
public override void OnLanguageChanged(SupportedLangs newLanguage)
{
if (CurrentLanguage == newLanguage) return;
_bundles.Clear();
_bundles.Add(Load(newLanguage.ToCultureInfo()));
if (newLanguage != FallbackLanguage) _bundles.Add(Load(FallbackLanguage.ToCultureInfo()));
}
private FluentBundle Load(CultureInfo culture)
{
return LinguiniBuilder.Builder()
.CultureInfo(culture)
.AddResources(_loadResources(culture))
.SetUseIsolating(false)
.UncheckedBuild();
}
private string GetMsg(string id, IDictionary<string, IFluentType>? args)
{
foreach (var bundle in _bundles)
{
if (bundle.TryGetMsg(id, null, args, out var errors, out var message))
{
if (errors.Count > 0)
{
throw new LinguiniException(errors);
}
return message;
}
}
throw new KeyNotFoundException();
}
private static bool Is<T>(Il2CppObjectBase o)
{
return IL2CPP.il2cpp_class_is_assignable_from(Il2CppClassPointerStore<T>.NativeClassPtr, IL2CPP.il2cpp_object_get_class(o.Pointer));
}
private static bool TryUnbox<T>(Il2CppObjectBase o, [NotNullWhen(true)] out T? result) where T : unmanaged
{
if (!Is<T>(o))
{
result = null;
return false;
}
result = o.Unbox<T>();
return true;
}
private static IFluentType ToFluentType(Object o)
{
if (Is<string>(o)) return new FluentString(IL2CPP.Il2CppStringToManaged(o.Pointer));
if (TryUnbox<byte>(o, out var @byte)) return (FluentNumber) @byte;
if (TryUnbox<sbyte>(o, out var @sbyte)) return (FluentNumber) @sbyte;
if (TryUnbox<short>(o, out var @short)) return (FluentNumber) @short;
if (TryUnbox<int>(o, out var @int)) return (FluentNumber) @int;
if (TryUnbox<long>(o, out var @long)) return (FluentNumber) @long;
if (TryUnbox<ushort>(o, out var @ushort)) return (FluentNumber) @ushort;
if (TryUnbox<uint>(o, out var @uint)) return (FluentNumber) @uint;
if (TryUnbox<ulong>(o, out var @ulong)) return (FluentNumber) @ulong;
if (TryUnbox<float>(o, out var @float)) return (FluentNumber) @float;
if (TryUnbox<double>(o, out var @double)) return (FluentNumber) @double;
return new FluentString(o.ToString());
}
private static IFluentType ToFluentType(object o)
{
return o switch
{
string str => (FluentString) str,
byte num => (FluentNumber) num,
sbyte num => (FluentNumber) num,
short num => (FluentNumber) num,
ushort num => (FluentNumber) num,
int num => (FluentNumber) num,
uint num => (FluentNumber) num,
long num => (FluentNumber) num,
ulong num => (FluentNumber) num,
double num => (FluentNumber) num,
float num => (FluentNumber) num,
_ => (FluentString) o.ToString()!,
};
}
/// <summary>
/// Returns the localized text for the given fluent message <paramref name="id"/>.
/// </summary>
/// <param name="id">The id of the message.</param>
/// <param name="args">The arguments used for formatting.</param>
/// <returns>Text localized and formatted by fluent.</returns>
public string GetText(string id, params (string, object)[] args)
{
var fluentArgs = new Dictionary<string, IFluentType>(args.Length);
foreach (var (key, value) in args)
{
fluentArgs[key] = ToFluentType(value);
}
return GetMsg(id, fluentArgs);
}
/// <inheritdoc/>
public override bool TryGetTextFormatted(StringNames stringName, Il2CppReferenceArray<Object> parts, [NotNullWhen(true)] out string? result)
{
if (_ids.TryGetValue(stringName, out var id))
{
var hasArgumentsOverride = _arguments.TryGetValue(stringName, out var arguments);
if (hasArgumentsOverride)
{
if (arguments!.Length != parts.Length)
throw new InvalidOperationException($"Arguments override for {id} has an invalid count of arguments");
}
var args = new Dictionary<string, IFluentType>(parts.Length);
for (var i = 0; i < parts.Count; i++)
{
var part = parts[i];
if (hasArgumentsOverride)
{
args[arguments![i]] = ToFluentType(part);
}
else
{
// Fluent doesn't allow positional variables nor starting variable names with numbers so we have to use a,b,c,d... instead
if (i > 25) throw new InvalidOperationException("Too many format parts");
var c = (char) ('a' + i);
args[c.ToString()] = ToFluentType(part);
}
}
result = GetMsg(id, args);
return true;
}
result = null;
return false;
}
/// <inheritdoc/>
public override bool TryGetText(StringNames stringName, [NotNullWhen(true)] out string? result)
{
if (_ids.TryGetValue(stringName, out var id))
{
result = GetMsg(id, null);
return true;
}
result = null;
return false;
}
}
+4
View File
@@ -39,6 +39,8 @@ public static class ModList
return _modByPluginType[pluginType];
}
internal static bool IsAnyModIsRequiredOnAllClients { get; private set; }
private static readonly Dictionary<uint, Mod> _modByNetId = new();
private static readonly Dictionary<Mod, uint> _netIdByMod = new();
@@ -113,6 +115,8 @@ public static class ModList
netId++;
}
IsAnyModIsRequiredOnAllClients = Current.Any(m => m.IsRequiredOnAllClients);
var debug = new StringBuilder("Mod list:");
foreach (var mod in Current)
{
+12 -5
View File
@@ -1,4 +1,5 @@
using System;
using AmongUs.Data;
using HarmonyLib;
using Hazel;
using Il2CppInterop.Runtime;
@@ -59,7 +60,7 @@ internal static class ClientPatches
return false;
}
if (ReactorConnection.Instance!.Syncer == Syncer.Host && reader.Tag == InnerNetClient.SceneChangeFlag)
if (reader.Tag == InnerNetClient.SceneChangeFlag && ReactorConnection.Instance?.Syncer == Syncer.Host)
{
var clientId = reader.ReadPackedInt32();
var clientData = innerNetClient.FindClientById(clientId);
@@ -83,17 +84,23 @@ internal static class ClientPatches
if (innerNetClient.AmHost)
{
if (reactorClientData == null)
if (reactorClientData == null && ModList.IsAnyModIsRequiredOnAllClients)
{
Warning("Kicking " + clientData.PlayerName + " for not having Reactor installed");
PlayerControl.LocalPlayer.RpcSendChat(clientData.PlayerName + " tried joining without Reactor installed");
var chatText = clientData.PlayerName + " tried joining without Reactor installed";
if (DataManager.Settings.Multiplayer.ChatMode == QuickChatModes.FreeChatOrQuickChat)
PlayerControl.LocalPlayer.RpcSendChat(chatText);
else
HudManager.Instance.Chat.AddChat(PlayerControl.LocalPlayer, chatText);
innerNetClient.KickPlayer(clientData.Id, false);
__result = false;
return false;
}
if (!Mod.Validate(reactorClientData.Mods, ModList.Current, out var reason))
if (!Mod.Validate(reactorClientData?.Mods ?? Array.Empty<Mod>(), ModList.Current, out var reason))
{
innerNetClient.KickWithReason(clientData.Id, reason);
__result = false;
@@ -234,7 +241,7 @@ internal static class ClientPatches
{
public static bool Prefix(InnerNetClient __instance, [HarmonyArgument(0)] MessageReader reader)
{
if (__instance.GameMode == GameModes.FreePlay) return true;
if (__instance.NetworkMode == NetworkModes.FreePlay) return true;
var isFirst = false;
+4 -4
View File
@@ -87,7 +87,7 @@ internal static class HttpPatches
{
if (responseHeader == null)
{
DisconnectPopup.Instance.ShowCustom(Translate.Messages.VanillaServerWarning);
DisconnectPopup.Instance.ShowCustom("This region doesn't support modded handshake.\nThe lobbies shown may not be compatible with your current mods.\nFor more info see https://reactor.gg/handshake");
}
}
@@ -102,8 +102,8 @@ internal static class HttpPatches
{
public static void Postfix(GameStartManager __instance)
{
if (AmongUsClient.Instance.GameMode != GameModes.OnlineGame) return;
if (ModList.Current.Any(m => m.IsRequiredOnAllClients) && !IsCurrentRegionModded())
if (AmongUsClient.Instance.NetworkMode != NetworkModes.OnlineGame) return;
if (ModList.IsAnyModIsRequiredOnAllClients && !IsCurrentRegionModded())
{
Warning("Vanilla region, locking public toggle");
@@ -126,7 +126,7 @@ internal static class HttpPatches
size.x *= 2.5f;
background.size = size;
popup.TextAreaTMP.fontSizeMin = 2;
popup.Show(Translate.Messages.PublicLobbyWarning);
popup.Show("You can't make public lobbies on regions that don't support modded handshake.\nFor more info see https://reactor.gg/handshake");
}));
if (AmongUsClient.Instance.AmHost && AmongUsClient.Instance.IsGamePublic)
+18
View File
@@ -0,0 +1,18 @@
using HarmonyLib;
namespace Reactor.Patches.Fixes;
/// <summary>
/// Fixes Game Lists not working on servers using legacy matchmaking.
/// </summary>
[HarmonyPatch(typeof(AmongUsClient._CoFindGame_d__3), nameof(AmongUsClient._CoFindGame_d__3.MoveNext))]
internal static class CoFindGamePatch
{
public static void Prefix()
{
if (AmongUsClient.Instance.LastDisconnectReason == DisconnectReasons.Unknown)
{
AmongUsClient.Instance.LastDisconnectReason = DisconnectReasons.ExitGame;
}
}
}
-5
View File
@@ -1,7 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<LangVersion>latest</LangVersion>
<EnableDynamicLoading>true</EnableDynamicLoading>
<Description>Core mod and API for Among Us</Description>
@@ -17,14 +16,10 @@
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
<Compile Include="..\Reactor.Networking.Shared\**\*.cs" LinkBase="Networking" Visible="false" />
<PackageReference Include="Linguini.Bundle" Version="0.3.1" />
<ProjectReference Include="..\Reactor.Linguinitor\Reactor.Linguinitor.csproj" ReferenceOutputAssembly="false" OutputItemType="Analyzer" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Assets\**\*" Exclude="Assets\icon.png" />
<AdditionalFiles Include="Assets\Localization\en\*.ftl" />
</ItemGroup>
<Import Project="../AmongUs.props" />
-3
View File
@@ -41,8 +41,6 @@ public partial class ReactorPlugin : BasePlugin
internal RegionInfoWatcher RegionInfoWatcher { get; } = new();
internal FluentLocalizationProvider LocalizationProvider { get; } = FluentLocalizationProvider.FromEmbeddedResources("Reactor.Assets.Localization");
/// <inheritdoc />
public ReactorPlugin()
{
@@ -57,7 +55,6 @@ public partial class ReactorPlugin : BasePlugin
MethodRpcAttribute.Initialize();
LocalizationManager.Register(new HardCodedLocalizationProvider());
LocalizationManager.Register(Translate.Provider = LocalizationProvider);
}
/// <inheritdoc />
+30 -53
View File
@@ -4,9 +4,9 @@
"net6.0": {
"AmongUs.GameLibs.Steam": {
"type": "Direct",
"requested": "[2022.10.25, )",
"resolved": "2022.10.25",
"contentHash": "PWgkH/VvMlShVhZB8G432q0tnMaNVZrbIdbEMCZN/fETUlT/ch+qQj4PdTcZhPHREbnJHH3ijHxlca1d7QMBcQ=="
"requested": "[2022.12.8, )",
"resolved": "2022.12.8",
"contentHash": "IJsIi89xUYRvA54YtNVEJjf25hhF3LWzkNBslKCNDUpL1aQ/PhNyO4j18pO71DCgW/qr1P1j8+CwByuBLsInNA=="
},
"BepInEx.AutoPlugin": {
"type": "Direct",
@@ -22,31 +22,21 @@
},
"BepInEx.Unity.IL2CPP": {
"type": "Direct",
"requested": "[6.0.0-be.662, )",
"resolved": "6.0.0-be.662",
"contentHash": "fn7jQ88IBmjssoY9XjGBTg3cULkS+N/le/eUijYf2VV8raWok/6cU/GbU9bejkJS8g+2MvzIwnROAhAxvrGI2Q==",
"requested": "[6.0.0-be.663, )",
"resolved": "6.0.0-be.663",
"contentHash": "J+mZ4svyTt4ZYbUoPwpVtF5QCGfzC42VuYJ7z1K6Qt8YlBEZx3rnmUmaEnoJIqN5wN7BSnQgzEmrRfdbrgtTnA==",
"dependencies": {
"BepInEx.Core": "6.0.0-be.662",
"BepInEx.Unity.Common": "6.0.0-be.662",
"HarmonyX": "2.10.0",
"BepInEx.Core": "6.0.0-be.663",
"BepInEx.Unity.Common": "6.0.0-be.663",
"HarmonyX": "2.10.1",
"Iced": "1.17.0",
"Il2CppInterop.Generator": "1.3.0",
"Il2CppInterop.HarmonySupport": "1.3.0",
"Il2CppInterop.Runtime": "1.3.0",
"Il2CppInterop.Generator": "1.4.0",
"Il2CppInterop.HarmonySupport": "1.4.0",
"Il2CppInterop.Runtime": "1.4.0",
"MonoMod.RuntimeDetour": "22.5.1.1",
"Samboy063.Cpp2IL.Core": "2022.0.7.2"
}
},
"Linguini.Bundle": {
"type": "Direct",
"requested": "[0.3.1, )",
"resolved": "0.3.1",
"contentHash": "k3D0IBSsS91T0G9rYACRYtAS27NDTGz4T3ygHhbhaFdA9i3cCfCpR39MqYEpoA1Ark3lzmvklHePmRCX5EQi1A==",
"dependencies": {
"Linguini.Shared": "0.3.0",
"Linguini.Syntax": "0.3.0"
}
},
"Microsoft.SourceLink.GitHub": {
"type": "Direct",
"requested": "[1.1.1, )",
@@ -73,18 +63,18 @@
},
"BepInEx.Core": {
"type": "Transitive",
"resolved": "6.0.0-be.662",
"contentHash": "VVBeCD/KQVy0/TK3V6SD8QZ/es35Xb1mEz/+PbBs3ST1yUC1r7k2JOymhSnmghVqf6UsvlMglOO9pljqhuE/Pw==",
"resolved": "6.0.0-be.663",
"contentHash": "yTlqwieyV3FCzSo4tfiIlS7pTqVtEZwrwHnograkWO4loECeYpShcpoCoxnhQ0vkWsnWGThMK7NodHhjZ+jQDA==",
"dependencies": {
"HarmonyX": "2.10.0",
"HarmonyX": "2.10.1",
"MonoMod.Utils": "22.5.1.1",
"SemanticVersioning": "2.0.2"
}
},
"BepInEx.Unity.Common": {
"type": "Transitive",
"resolved": "6.0.0-be.662",
"contentHash": "BgETw6+snwY//3xjQxLiiEAFRmXaMTcSkg+1UQz6fVBG0YA5Usm/m4GflhTc3nwF61KO3Iznn1AORi5CwLJoUw==",
"resolved": "6.0.0-be.663",
"contentHash": "kxv0yXJQ7YPzUQzlwkpVzmTkdd87kVcQhMjkrwqpowJ0Yx5vEwPUrRyG/pwMH5/cK+2WHCn/2akGWrW0C4vUAQ==",
"dependencies": {
"AssetRipper.VersionUtilities": "1.2.1",
"MonoMod.Utils": "22.5.1.1"
@@ -92,8 +82,8 @@
},
"HarmonyX": {
"type": "Transitive",
"resolved": "2.10.0",
"contentHash": "4ayiy/dlCiW86K2N7Jvbf+VpI5wvP7dncv/6oRmfwRi32UCmCRzCGzsxdMfzJZkp6/26oBW+DrD8vi4UejzVAg==",
"resolved": "2.10.1",
"contentHash": "9LodMC9Y0u1TW96eKJoWrFJFpmzbgojEO38/Q+e7c1mFPhmHt8xcR8qhI06iF1rf0Dnsk+hqENFVSgbtwl/bEw==",
"dependencies": {
"MonoMod.RuntimeDetour": "22.3.23.4",
"System.Reflection.Emit": "4.7.0"
@@ -106,8 +96,8 @@
},
"Il2CppInterop.Common": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "IR3BrZXvL2nvJAn4pruPMgC78Y87hVa5xTYZCuHN67OzRD6WDl5dTO55vtvTl8dXFALKvlN+spja2tXhVuquOw==",
"resolved": "1.4.0",
"contentHash": "xl60qoa1nImG6qgOQcjSDW46nLQHoRvSWE7QTDQz7XeMsGwOxAbgDtOvJ4gOvoLijTU79gFZYe8H1CM7TcTQ5g==",
"dependencies": {
"Iced": "1.17.0",
"Microsoft.Extensions.Logging.Abstractions": "6.0.1",
@@ -116,29 +106,29 @@
},
"Il2CppInterop.Generator": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "FuhPxbh/K4K94U3xac/ClMaaBp+MZ4aIaqi5dR0QihyGQoombT+OM/A22RwAIzbaCTbFbvabWaAuOSgB69ZwWQ==",
"resolved": "1.4.0",
"contentHash": "Q4QqkwQroDwwqB17/DRF6hbHQRIuyLksgxVUEDvXZ3T+ogkrZB9h0Ev36alN0f6e7fcZPRkMrpXOAYwZzPiZag==",
"dependencies": {
"Il2CppInterop.Common": "1.3.0",
"Il2CppInterop.Common": "1.4.0",
"Mono.Cecil": "0.11.3"
}
},
"Il2CppInterop.HarmonySupport": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "VppBnXtbMNGFhX8a1gg/85E883t2pW/+FZyV7eOaOXMNQyorg++u+kUFOIYwNpzTVqxWmMeoPS0DH0toVpjoKA==",
"resolved": "1.4.0",
"contentHash": "Uz4w5PbQ3kLXqUrsQxR35f7xMpfnxLiXthVtNaT3fvHXC8B7arjuBZXeCbcozr6dXFJBDa5W0EElBmH0fWoASg==",
"dependencies": {
"HarmonyX": "2.10.0",
"Il2CppInterop.Runtime": "1.3.0"
"Il2CppInterop.Runtime": "1.4.0"
}
},
"Il2CppInterop.Runtime": {
"type": "Transitive",
"resolved": "1.3.0",
"contentHash": "8A+N2yvja960Ap+s2RpW7Nb6HSpyuXJy2ipIlU+1erYU9SWHMyU9JZzUZGOhwWXJChKGvRmDdTZAg12k1+72dg==",
"resolved": "1.4.0",
"contentHash": "ScgsFlbJ3gj5f69As/GT8pSO2WlS7cOeS/n3h4gBqJ01Eq/Lm+s3FBrGpEiuIWALOgmtQYimhjWVpxRt7LYtGw==",
"dependencies": {
"Iced": "1.17.0",
"Il2CppInterop.Common": "1.3.0"
"Il2CppInterop.Common": "1.4.0"
}
},
"IndexRange": {
@@ -151,19 +141,6 @@
"resolved": "2.1.0",
"contentHash": "YYpq7NM50bSSVUDjXyV/eiITk6syXqItPjKBOb3jEWS6RFsk0DNhpWMPW6b3hKDmArARuWDU6S2pVu1IeVrvIA=="
},
"Linguini.Shared": {
"type": "Transitive",
"resolved": "0.3.0",
"contentHash": "rEYA9jWU1Nc9iDuPKar+4IVXjFbGrcNyYZCeU6hiWQoS4nA2UecHu36Rp4bxzasvRGda4FB2JZqty75m4e26VQ=="
},
"Linguini.Syntax": {
"type": "Transitive",
"resolved": "0.3.0",
"contentHash": "v8YV3xPFZfP+OSWjMd6yysp+o7cNnQXxq/slN8Yekoi+dFjsTNF0YiQWJIwg1j2FUbs6claJxY9R1FFlc4s6MA==",
"dependencies": {
"Linguini.Shared": "0.3.0"
}
},
"Microsoft.Build.Tasks.Git": {
"type": "Transitive",
"resolved": "1.1.1",