From ae327e104867b48001f063a3d5d749909f4b69bc Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 8 Jul 2024 21:06:41 +0200 Subject: [PATCH 01/21] Extract strings --- Features/Aimbot.cs | 5 +- Features/Ammunition.cs | 5 +- Features/AutomaticGun.cs | 5 +- Features/BaseMapToggleFeature.cs | 12 +- Features/Commands.cs | 39 +- Features/CrossHair.cs | 5 +- Features/Durability.cs | 5 +- Features/Examine.cs | 5 +- Features/ExfiltrationPoints.cs | 17 +- Features/Feature.cs | 10 +- Features/FeatureRenderer.cs | 20 +- Features/FovChanger.cs | 5 +- Features/FreeCamera.cs | 5 +- Features/GameState.cs | 5 +- Features/Ghost.cs | 5 +- Features/Grenades.cs | 5 +- Features/Health.cs | 5 +- Features/Hits.cs | 5 +- Features/Hud.cs | 17 +- Features/Interact.cs | 5 +- Features/LootItems.cs | 5 +- Features/LootableContainers.cs | 5 +- Features/Map.cs | 5 +- Features/NightVision.cs | 5 +- Features/NoCollision.cs | 7 +- Features/NoMalfunctions.cs | 5 +- Features/NoRecoil.cs | 5 +- Features/NoSway.cs | 5 +- Features/NoVisor.cs | 5 +- Features/Players.cs | 5 +- Features/Quests.cs | 5 +- Features/QuickThrow.cs | 5 +- Features/Radar.cs | 5 +- Features/Skills.cs | 5 +- Features/Speed.cs | 5 +- Features/Stamina.cs | 5 +- Features/ThermalVision.cs | 5 +- Features/Train.cs | 5 +- Features/WallShoot.cs | 5 +- Features/Weather.cs | 7 +- Features/WorldInteractiveObjects.cs | 5 +- Installer/Compiler.cs | 2 +- NLog.EFT.Trainer.csproj | 12 + Properties/Strings.Designer.cs | 1818 +++++++++++++++++++++++++++ Properties/Strings.resx | 710 +++++++++++ 45 files changed, 2733 insertions(+), 103 deletions(-) create mode 100644 Properties/Strings.Designer.cs create mode 100644 Properties/Strings.resx diff --git a/Features/Aimbot.cs b/Features/Aimbot.cs index 48515716..3f54a6f1 100644 --- a/Features/Aimbot.cs +++ b/Features/Aimbot.cs @@ -4,6 +4,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -15,8 +16,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Aimbot : HoldFeature { - public override string Name => "aimbot"; - public override string Description => "Aimbot. Automatic aiming and/or shooting (SilentAim)."; + public override string Name => Strings.FeatureAimbotName; + public override string Description => Strings.FeatureAimbotDescription; public override KeyCode Key { get; set; } = KeyCode.Slash; diff --git a/Features/Ammunition.cs b/Features/Ammunition.cs index 974ddfd2..8c1b6779 100644 --- a/Features/Ammunition.cs +++ b/Features/Ammunition.cs @@ -3,6 +3,7 @@ using EFT.Ballistics; using EFT.InventoryLogic; using EFT.Trainer.Model; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -12,8 +13,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Ammunition : ToggleFeature { - public override string Name => "ammo"; - public override string Description => "Unlimited ammo."; + public override string Name => Strings.FeatureAmmunitionName; + public override string Description => Strings.FeatureAmmunitionDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/AutomaticGun.cs b/Features/AutomaticGun.cs index 1b9f6388..8db5363b 100644 --- a/Features/AutomaticGun.cs +++ b/Features/AutomaticGun.cs @@ -1,6 +1,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class AutomaticGun : ToggleFeature { - public override string Name => "autogun"; - public override string Description => "Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate."; + public override string Name => Strings.FeatureAutomaticGunName; + public override string Description => Strings.FeatureAutomaticGunDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/BaseMapToggleFeature.cs b/Features/BaseMapToggleFeature.cs index 7599935b..9be0fb78 100644 --- a/Features/BaseMapToggleFeature.cs +++ b/Features/BaseMapToggleFeature.cs @@ -42,7 +42,17 @@ internal abstract class BaseMapToggleFeature : ToggleFeature protected Camera? MapCamera => _mapCamera; - private static readonly string[] _directions = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"]; + private static readonly string[] _directions = [ + Properties.Strings.DirectionNorth, + Properties.Strings.DirectionNorthEast, + Properties.Strings.DirectionEast, + Properties.Strings.DirectionSouthEast, + Properties.Strings.DirectionSouth, + Properties.Strings.DirectionSouthWest, + Properties.Strings.DirectionWest, + Properties.Strings.DirectionNorthWest, + Properties.Strings.DirectionNorth + ]; protected void ToggleMapCameraIfNeeded(bool state) { diff --git a/Features/Commands.cs b/Features/Commands.cs index 18f777c8..13aff818 100644 --- a/Features/Commands.cs +++ b/Features/Commands.cs @@ -1,8 +1,10 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using EFT.Trainer.Configuration; using EFT.Trainer.ConsoleCommands; +using EFT.Trainer.Properties; using EFT.UI; using UnityEngine; @@ -12,8 +14,8 @@ namespace EFT.Trainer.Features; internal class Commands : FeatureRenderer { - public override string Name => "commands"; - public override string Description => "This main popup window."; + public override string Name => Strings.FeatureCommandsName; + public override string Description => Strings.FeatureCommandsDescription; [ConfigurationProperty(Skip = true)] // we do not want to offer save/load support for this public override bool Enabled { get; set; } = false; @@ -27,6 +29,7 @@ internal class Commands : FeatureRenderer public override KeyCode Key { get; set; } = KeyCode.RightAlt; private bool Registered { get; set; } = false; + private Dictionary PropertyDisplays { get; } = new(); protected override void Update() { @@ -39,9 +42,37 @@ protected override void Update() if (!PreloaderUI.Instantiated) return; + RegisterPropertyDisplays(); RegisterCommands(); } + private void RegisterPropertyDisplays() + { + const string prefix = "Property"; + + var properties = typeof(Strings) + .GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) + .Where(p => p.Name.StartsWith(prefix)); + + PropertyDisplays.Clear(); + + foreach (var property in properties) + { + var key = property.Name.Substring(prefix.Length); + var value = property.GetValue(null) as string ?? string.Empty; + + PropertyDisplays.Add(key, value); + } + } + + protected override string GetPropertyDisplay(string propertyName) + { + if (PropertyDisplays.TryGetValue(propertyName, out var value)) + return value; + + return $"!! [{propertyName}] !!"; // missing translation in Strings.resx + } + private void RegisterCommands() { foreach(var feature in Context.ToggleableFeatures.Value) @@ -58,10 +89,10 @@ private void RegisterCommands() command.Register(); // built-in commands - new BuiltInCommand("load", () => LoadSettings()) + new BuiltInCommand(Strings.CommandLoadName, () => LoadSettings()) .Register(); - new BuiltInCommand("save", SaveSettings) + new BuiltInCommand(Strings.CommandSaveName, SaveSettings) .Register(); // Load default configuration diff --git a/Features/CrossHair.cs b/Features/CrossHair.cs index 2d3801fa..dedd28d7 100644 --- a/Features/CrossHair.cs +++ b/Features/CrossHair.cs @@ -1,5 +1,6 @@ using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class CrossHair : ToggleFeature { - public override string Name => "crosshair"; - public override string Description => "Crosshair with customizable size, color, thickness and auto-hide feature when aiming."; + public override string Name => Strings.FeatureCrosshairName; + public override string Description => Strings.FeatureCrosshairDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Durability.cs b/Features/Durability.cs index 9dbbe726..18629c87 100644 --- a/Features/Durability.cs +++ b/Features/Durability.cs @@ -1,6 +1,7 @@ using System.Linq; using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Durability : ToggleFeature { - public override string Name => "durability"; - public override string Description => "Maximum durability of items."; + public override string Name => Strings.FeatureDurabilityName; + public override string Description => Strings.FeatureDurabilityDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Examine.cs b/Features/Examine.cs index 6723fa98..0dfd8cfe 100644 --- a/Features/Examine.cs +++ b/Features/Examine.cs @@ -1,4 +1,5 @@ using EFT.InventoryLogic; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -8,8 +9,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Examine : ToggleFeature { - public override string Name => "examine"; - public override string Description => "All items already examined. Instant search."; + public override string Name => Strings.FeatureExamineName; + public override string Description => Strings.FeatureExamineDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/ExfiltrationPoints.cs b/Features/ExfiltrationPoints.cs index 99a493aa..dc65cd02 100644 --- a/Features/ExfiltrationPoints.cs +++ b/Features/ExfiltrationPoints.cs @@ -5,6 +5,7 @@ using EFT.Interactive; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -15,8 +16,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class ExfiltrationPoints : PointOfInterests { - public override string Name => "exfil"; - public override string Description => "Exfiltration points with customizable colors given eligibility, status filter, distance."; + public override string Name => Strings.FeatureExfiltrationPointsName; + public override string Description => Strings.FeatureExfiltrationPointsDescription; [ConfigurationProperty(Order = 10)] public Color EligibleColor { get; set; } = Color.green; @@ -104,12 +105,12 @@ public static string GetStatus(EExfiltrationStatus status) { return status switch { - EExfiltrationStatus.AwaitsManualActivation => "Activate", - EExfiltrationStatus.Countdown => "Timer", - EExfiltrationStatus.NotPresent => "Closed", - EExfiltrationStatus.Pending => "Pending", - EExfiltrationStatus.RegularMode => "Open", - EExfiltrationStatus.UncompleteRequirements => "Requirement", + EExfiltrationStatus.AwaitsManualActivation => Properties.Strings.FeatureExfiltrationPointsStatusActivate, + EExfiltrationStatus.Countdown => Properties.Strings.FeatureExfiltrationPointsStatusTimer, + EExfiltrationStatus.NotPresent => Properties.Strings.FeatureExfiltrationPointsStatusClosed, + EExfiltrationStatus.Pending => Properties.Strings.FeatureExfiltrationPointsStatusPending, + EExfiltrationStatus.RegularMode => Properties.Strings.FeatureExfiltrationPointsStatusOpen, + EExfiltrationStatus.UncompleteRequirements => Properties.Strings.FeatureExfiltrationPointsStatusRequirement, _ => string.Empty }; } diff --git a/Features/Feature.cs b/Features/Feature.cs index 3ed72bc9..8cc6adf0 100644 --- a/Features/Feature.cs +++ b/Features/Feature.cs @@ -35,14 +35,14 @@ public void HarmonyPrefix(HarmonyLib.Harmony harmony, Type originalType, string var original = HarmonyLib.AccessTools.Method(originalType, originalMethod, parameters); if (original == null) { - AddConsoleLog($"Cannot find original method {originalType}.{originalMethod}"); + AddConsoleLog(string.Format(Properties.Strings.ErrorCannotFindOriginalMethodFormat, $"{originalType}.{originalMethod}")); return; } var prefix = HarmonyLib.AccessTools.Method(GetType(), newMethod); if (prefix == null) { - AddConsoleLog($"Cannot find prefix method {newMethod}"); + AddConsoleLog(string.Format(Properties.Strings.ErrorCannotFindPrefixMethodFormat, newMethod)); return; } @@ -57,20 +57,20 @@ public void HarmonyPostfix(HarmonyLib.Harmony harmony, Type originalType, string var original = HarmonyLib.AccessTools.Method(originalType, originalMethod); if (original == null) { - AddConsoleLog($"Cannot find original method {originalType}.{originalMethod}"); + AddConsoleLog(string.Format(Properties.Strings.ErrorCannotFindOriginalMethodFormat, $"{originalType}.{originalMethod}")); return; } var postfix = HarmonyLib.AccessTools.Method(GetType(), newMethod); if (postfix == null) { - AddConsoleLog($"Cannot find postfix method {newMethod}"); + AddConsoleLog(string.Format(Properties.Strings.ErrorCannotFindPostfixMethodFormat, newMethod)); return; } harmony.Patch(original, postfix: new HarmonyLib.HarmonyMethod(postfix)); #if DEBUG - AddConsoleLog($"Patched {originalType}.{originalMethod} with {GetType()}.{newMethod}"); + AddConsoleLog(string.Format(Properties.Strings.DebugPatchedMethodFormat, $"{originalType}.{originalMethod}", $"{GetType()}.{newMethod}")); #endif } diff --git a/Features/FeatureRenderer.cs b/Features/FeatureRenderer.cs index bb4d2b4b..37d88047 100644 --- a/Features/FeatureRenderer.cs +++ b/Features/FeatureRenderer.cs @@ -4,6 +4,7 @@ using System.Linq; using EFT.InputSystem; using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using UnityEngine; @@ -44,7 +45,6 @@ private static float FixCoordinate(float coord, float maxValue, float defaultVal return coord; } - internal abstract class SelectionContext { protected SelectionContext(IFeature feature, OrderedProperty orderedProperty, float parentX, float parentY, Func> builder) @@ -91,7 +91,7 @@ protected override void OnGUIWhenEnabled() _keyCodeSelectionContext = null; } - private static bool HandleSelectionContext(SelectionContext? context) + private bool HandleSelectionContext(SelectionContext? context) { if (context == null) return false; @@ -99,7 +99,7 @@ private static bool HandleSelectionContext(SelectionContext? context) var property = context.OrderedProperty.Property; var picker = context.Picker; - picker.DrawWindow(context.Id, property.Name); + picker.DrawWindow(context.Id, GetPropertyDisplay(property.Name)); property.SetValue(context.Feature, picker.Value); return picker.IsSelected; @@ -108,7 +108,7 @@ private static bool HandleSelectionContext(SelectionContext? context) private int _selectedTabIndex = 0; private void RenderFeatureWindow(int id) { - var fixedTabs = new[] {"[summary]"}; + var fixedTabs = new[] {Strings.FeatureRendererSummary}; var tabs = fixedTabs .Concat @@ -164,12 +164,12 @@ private void RenderSummary() { GUILayout.BeginVertical(); - GUILayout.Label("Welcome to EFT Trainer !\n", DescriptionStyle); + GUILayout.Label($"{Strings.FeatureRendererWelcome}\n", DescriptionStyle); - if (GUILayout.Button("Load settings")) + if (GUILayout.Button(Strings.CommandLoadDescription)) LoadSettings(); - if (GUILayout.Button("Save settings")) + if (GUILayout.Button(Strings.CommandSaveDescription)) SaveSettings(); GUILayout.EndVertical(); @@ -220,7 +220,7 @@ private void RenderFeatureProperty(Feature feature, OrderedProperty orderedPrope GUILayout.FlexibleSpace(); GUILayout.BeginHorizontal(); - GUILayout.Label(property.Name, LabelStyle); + GUILayout.Label(GetPropertyDisplay(property.Name), LabelStyle); GUILayout.FlexibleSpace(); var currentValue = property.GetValue(feature); @@ -247,6 +247,8 @@ private void RenderFeatureProperty(Feature feature, OrderedProperty orderedPrope GUILayout.EndHorizontal(); } + protected abstract string GetPropertyDisplay(string propertyName); + private object RenderFeaturePropertyAsUIComponent(IFeature feature, OrderedProperty orderedProperty, object currentValue, GUILayoutOption width) { var property = orderedProperty.Property; @@ -305,7 +307,7 @@ private object RenderFeaturePropertyAsUIComponent(IFeature feature, OrderedPrope } - GUILayout.Label($"Unsupported type: {propertyType.FullName}"); + GUILayout.Label(string.Format(Strings.ErrorUnsupportedTypeFormat, propertyType.FullName)); break; } diff --git a/Features/FovChanger.cs b/Features/FovChanger.cs index eda2e918..8319f9b9 100644 --- a/Features/FovChanger.cs +++ b/Features/FovChanger.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -7,8 +8,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class FovChanger : ToggleFeature { - public override string Name => "fovchanger"; - public override string Description => "Change Field Of View (FOV)."; + public override string Name => Strings.FeatureFovChangerName; + public override string Description => Strings.FeatureFovChangerDescription; [ConfigurationProperty(Order = 1)] public override bool Enabled { get; set; } = false; diff --git a/Features/FreeCamera.cs b/Features/FreeCamera.cs index b14e3419..c81ec933 100644 --- a/Features/FreeCamera.cs +++ b/Features/FreeCamera.cs @@ -1,5 +1,6 @@ using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -13,8 +14,8 @@ internal class FreeCamera : ToggleFeature private const string MouseXAxis = "Mouse X"; private const string MouseYAxis = "Mouse Y"; - public override string Name => "camera"; - public override string Description => "Free camera with fast mode and teleportation."; + public override string Name => Strings.FeatureCameraName; + public override string Description => Strings.FeatureCameraDescription; [ConfigurationProperty(Skip = true)] // we do not want to offer save/load support for this public override bool Enabled { get; set; } = false; diff --git a/Features/GameState.cs b/Features/GameState.cs index 7735d2de..d06c58e5 100644 --- a/Features/GameState.cs +++ b/Features/GameState.cs @@ -4,6 +4,7 @@ using Comfort.Common; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -13,8 +14,8 @@ namespace EFT.Trainer.Features; internal class GameState : CachableFeature { - public override string Name => "gamestate"; - public override string Description => "Refresh all game information for other features."; + public override string Name => Strings.FeatureGameStateName; + public override string Description => Strings.FeatureGameStateDescription; public static GameStateSnapshot? Current { get; private set; } diff --git a/Features/Ghost.cs b/Features/Ghost.cs index de9f08f4..86e8f2ac 100644 --- a/Features/Ghost.cs +++ b/Features/Ghost.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Ghost : ToggleFeature { - public override string Name => "ghost"; - public override string Description => "Stop bots from seeing you."; + public override string Name => Strings.FeatureGhostName; + public override string Description => Strings.FeatureGhostDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Grenades.cs b/Features/Grenades.cs index 929b7add..83471ebf 100644 --- a/Features/Grenades.cs +++ b/Features/Grenades.cs @@ -2,6 +2,7 @@ using Comfort.Common; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -12,8 +13,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Grenades : CachableFeature { - public override string Name => "grenade"; - public override string Description => "Grenades outline."; + public override string Name => Strings.FeatureGrenadesName; + public override string Description => Strings.FeatureGrenadesDescription; [ConfigurationProperty] public Color Color { get; set; } = Color.red; diff --git a/Features/Health.cs b/Features/Health.cs index 07414984..5a2149c4 100644 --- a/Features/Health.cs +++ b/Features/Health.cs @@ -2,6 +2,7 @@ using EFT.HealthSystem; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Health : ToggleFeature { - public override string Name => "health"; - public override string Description => "Full health, prevent any damage (so even when falling), keep energy and hydration at maximum."; + public override string Name => Strings.FeatureHealthName; + public override string Description => Strings.FeatureHealthDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Hits.cs b/Features/Hits.cs index 501a88eb..38f6433d 100644 --- a/Features/Hits.cs +++ b/Features/Hits.cs @@ -2,6 +2,7 @@ using EFT.HealthSystem; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -13,8 +14,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Hits : ToggleFeature { - public override string Name => "hits"; - public override string Description => "Hit markers (hit, armor, health with configurable colors)."; + public override string Name => Strings.FeatureHitsName; + public override string Description => Strings.FeatureHitsDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Hud.cs b/Features/Hud.cs index b308a7f8..f3fb135a 100644 --- a/Features/Hud.cs +++ b/Features/Hud.cs @@ -4,6 +4,7 @@ using EFT.Trainer.UI; using UnityEngine; using System.Text; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -13,8 +14,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Hud : ToggleFeature { - public override string Name => "hud"; - public override string Description => "HUD (compass, ammo left in chamber / magazine, fire mode, coordinates)."; + public override string Name => Strings.FeatureHudName; + public override string Description => Strings.FeatureHudDescription; [ConfigurationProperty] public Color Color { get; set; } = Color.white; @@ -22,7 +23,17 @@ internal class Hud : ToggleFeature [ConfigurationProperty] public bool ShowCompass { get; set; } = true; - private static readonly string[] _directions = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"]; + private static readonly string[] _directions = [ + Properties.Strings.DirectionNorth, + Properties.Strings.DirectionNorthEast, + Properties.Strings.DirectionEast, + Properties.Strings.DirectionSouthEast, + Properties.Strings.DirectionSouth, + Properties.Strings.DirectionSouthWest, + Properties.Strings.DirectionWest, + Properties.Strings.DirectionNorthWest, + Properties.Strings.DirectionNorth + ]; [ConfigurationProperty] public bool ShowCoordinates { get; set; } = false; diff --git a/Features/Interact.cs b/Features/Interact.cs index 03ae93c3..382592b9 100644 --- a/Features/Interact.cs +++ b/Features/Interact.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using JetBrains.Annotations; namespace EFT.Trainer.Features; @@ -6,8 +7,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Interact : ToggleFeature { - public override string Name => "interact"; - public override string Description => "Change distance for loot/door interaction."; + public override string Name => Strings.FeatureInteractName; + public override string Description => Strings.FeatureInteractDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/LootItems.cs b/Features/LootItems.cs index e17d48ce..5ab849ee 100644 --- a/Features/LootItems.cs +++ b/Features/LootItems.cs @@ -6,6 +6,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.UI; using JsonType; using UnityEngine; @@ -17,8 +18,8 @@ namespace EFT.Trainer.Features; // StayInTarkov (SIT) is exposing a LootItems type in the global namespace, so make sure to use a qualified name for this one internal class LootItems : PointOfInterests { - public override string Name => "loot"; - public override string Description => "List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display."; + public override string Name => Strings.FeatureLootItemsName; + public override string Description => Strings.FeatureLootItemsDescription; [ConfigurationProperty] public Color Color { get; set; } = Color.cyan; diff --git a/Features/LootableContainers.cs b/Features/LootableContainers.cs index 50adfca1..ac51e0a4 100644 --- a/Features/LootableContainers.cs +++ b/Features/LootableContainers.cs @@ -3,6 +3,7 @@ using EFT.Interactive; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -13,8 +14,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class LootableContainers : PointOfInterests { - public override string Name => "stash"; - public override string Description => "Hidden/special stashes like buried barrels, ground caches, air drops or corpses."; + public override string Name => Strings.FeatureStashName; + public override string Description => Strings.FeatureStashDescription; //Static Hashset for List of Container IDS private static readonly HashSet _targetedContainer = diff --git a/Features/Map.cs b/Features/Map.cs index 57040f35..b14f7afb 100644 --- a/Features/Map.cs +++ b/Features/Map.cs @@ -1,5 +1,6 @@ using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Map : BaseMapToggleFeature { - public override string Name => "map"; - public override string Description => "Full screen map with radar esp."; + public override string Name => Strings.FeatureMapName; + public override string Description => Strings.FeatureMapDescription; [ConfigurationProperty(Skip = true)] // we do not want to offer save/load support for this public override bool Enabled { get; set; } = false; diff --git a/Features/NightVision.cs b/Features/NightVision.cs index f32dfab3..d9b51fd2 100644 --- a/Features/NightVision.cs +++ b/Features/NightVision.cs @@ -1,5 +1,6 @@ using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NightVision : ToggleFeature { - public override string Name => "night"; - public override string Description => "Night vision."; + public override string Name => Strings.FeatureNightVisionName; + public override string Description => Strings.FeatureNightVisionDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoCollision.cs b/Features/NoCollision.cs index aff9fce5..dbb52b0f 100644 --- a/Features/NoCollision.cs +++ b/Features/NoCollision.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using UnityEngine; #nullable enable @@ -8,8 +9,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoCollision : ToggleFeature { - public override string Name => "nocoll"; - public override string Description => "No physical collisions, making you immune to bullets, grenades and barbed wires."; + public override string Name => Strings.FeatureNoCollisionName; + public override string Description => Strings.FeatureNoCollisionDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoMalfunctions.cs b/Features/NoMalfunctions.cs index abddd7c8..73533363 100644 --- a/Features/NoMalfunctions.cs +++ b/Features/NoMalfunctions.cs @@ -1,5 +1,6 @@ using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoMalfunctions : ToggleFeature { - public override string Name => "nomal"; - public override string Description => "No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating."; + public override string Name => Strings.FeatureNoMalfunctionsName; + public override string Description => Strings.FeatureNoMalfunctionsDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoRecoil.cs b/Features/NoRecoil.cs index a6dc564c..cd9c8a03 100644 --- a/Features/NoRecoil.cs +++ b/Features/NoRecoil.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -8,8 +9,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoRecoil : ToggleFeature { - public override string Name => "norecoil"; - public override string Description => "No recoil."; + public override string Name => Strings.FeatureNoRecoilName; + public override string Description => Strings.FeatureNoRecoilDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoSway.cs b/Features/NoSway.cs index b45fd367..75a87f27 100644 --- a/Features/NoSway.cs +++ b/Features/NoSway.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoSway : ToggleFeature { - public override string Name => "nosway"; - public override string Description => "No sway."; + public override string Name => Strings.FeatureNoSwayName; + public override string Description => Strings.FeatureNoSwayDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/NoVisor.cs b/Features/NoVisor.cs index 0ddaeb30..1066897c 100644 --- a/Features/NoVisor.cs +++ b/Features/NoVisor.cs @@ -1,4 +1,5 @@ using System; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class NoVisor : ToggleFeature { - public override string Name => "novisor"; - public override string Description => "No visor, so even when using a face shield-visor you won't see it."; + public override string Name => Strings.FeatureNoVisorName; + public override string Description => Strings.FeatureNoVisorDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Players.cs b/Features/Players.cs index e478fe43..3fdc06e6 100644 --- a/Features/Players.cs +++ b/Features/Players.cs @@ -5,6 +5,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -42,8 +43,8 @@ public class ShootableColor(Color color, Color borderColor) : IFeature [UsedImplicitly] internal class Players : ToggleFeature { - public override string Name => "wallhack"; - public override string Description => "Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance."; + public override string Name => Strings.FeaturePlayersName; + public override string Description => Strings.FeaturePlayersDescription; [ConfigurationProperty(Order = 10)] public PlayerColor BearColors { get; set; } = new(Color.blue, Color.red, Color.red); diff --git a/Features/Quests.cs b/Features/Quests.cs index 2f12969a..a97c4f62 100644 --- a/Features/Quests.cs +++ b/Features/Quests.cs @@ -6,6 +6,7 @@ using EFT.Quests; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -16,8 +17,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Quests : PointOfInterests { - public override string Name => "quest"; - public override string Description => "Locations for taking/placing quest items. Only items related to your started quests are displayed."; + public override string Name => Strings.FeatureQuestsName; + public override string Description => Strings.FeatureQuestsDescription; [ConfigurationProperty] public Color Color { get; set; } = Color.magenta; diff --git a/Features/QuickThrow.cs b/Features/QuickThrow.cs index e692ccb8..39bbf922 100644 --- a/Features/QuickThrow.cs +++ b/Features/QuickThrow.cs @@ -1,6 +1,7 @@ using System.Linq; using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class QuickTrow : TriggerFeature { - public override string Name => "quickthrow"; - public override string Description => "Quick-throw grenades."; + public override string Name => Strings.FeatureQuickTrowName; + public override string Description => Strings.FeatureQuickTrowDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/Radar.cs b/Features/Radar.cs index b45745a5..5d3cb036 100644 --- a/Features/Radar.cs +++ b/Features/Radar.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Radar : BaseMapToggleFeature { - public override string Name => "radar"; - public override string Description => "2D radar."; + public override string Name => Strings.FeatureRadarName; + public override string Description => Strings.FeatureRadarDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Skills.cs b/Features/Skills.cs index 97768b81..f8226dd5 100644 --- a/Features/Skills.cs +++ b/Features/Skills.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Skills : TriggerFeature { - public override string Name => "skills"; - public override string Description => "All skills to Elite level (51) and all weapons mastering to level 3."; + public override string Name => Strings.FeatureSkillsName; + public override string Description => Strings.FeatureSkillsDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/Speed.cs b/Features/Speed.cs index d3d0b5ea..e6eee98b 100644 --- a/Features/Speed.cs +++ b/Features/Speed.cs @@ -1,5 +1,6 @@ using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Speed : HoldFeature { - public override string Name => "speed"; - public override string Description => "Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself."; + public override string Name => Strings.FeatureSpeedName; + public override string Description => Strings.FeatureSpeedDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/Stamina.cs b/Features/Stamina.cs index 850e045b..1d5efe8d 100644 --- a/Features/Stamina.cs +++ b/Features/Stamina.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Stamina : ToggleFeature { - public override string Name => "stamina"; - public override string Description => "Unlimited stamina."; + public override string Name => Strings.FeatureStaminaName; + public override string Description => Strings.FeatureStaminaDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/ThermalVision.cs b/Features/ThermalVision.cs index 4ce27a25..b6edf850 100644 --- a/Features/ThermalVision.cs +++ b/Features/ThermalVision.cs @@ -1,5 +1,6 @@ using EFT.InventoryLogic; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class ThermalVision : ToggleFeature { - public override string Name => "thermal"; - public override string Description => "Thermal vision."; + public override string Name => Strings.FeatureThermalVisionName; + public override string Description => Strings.FeatureThermalVisionDescription; public override bool Enabled { get; set; } = false; diff --git a/Features/Train.cs b/Features/Train.cs index b7581956..bd3f3ca8 100644 --- a/Features/Train.cs +++ b/Features/Train.cs @@ -1,5 +1,6 @@ using System; using EFT.MovingPlatforms; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Train : TriggerFeature { - public override string Name => "train"; - public override string Description => "Summon train on compatible maps like Reserve or Lighthouse."; + public override string Name => Strings.FeatureTrainName; + public override string Description => Strings.FeatureTrainDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/WallShoot.cs b/Features/WallShoot.cs index 61fd5bd6..85160b17 100644 --- a/Features/WallShoot.cs +++ b/Features/WallShoot.cs @@ -1,6 +1,7 @@ using EFT.Ballistics; using EFT.Trainer.Extensions; using EFT.Trainer.Model; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -11,8 +12,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class WallShoot : ToggleFeature { - public override string Name => "wallshoot"; - public override string Description => "Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet."; + public override string Name => Strings.FeatureWallShootName; + public override string Description => Strings.FeatureFeatureWallShootDescription; #pragma warning disable IDE0060 [UsedImplicitly] diff --git a/Features/Weather.cs b/Features/Weather.cs index f23774d3..854a1c1f 100644 --- a/Features/Weather.cs +++ b/Features/Weather.cs @@ -1,4 +1,5 @@ -using EFT.Weather; +using EFT.Trainer.Properties; +using EFT.Weather; using JetBrains.Annotations; using UnityEngine; @@ -9,8 +10,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class Weather : TriggerFeature { - public override string Name => "weather"; - public override string Description => "Clear weather."; + public override string Name => Strings.FeatureWeatherName; + public override string Description => Strings.FeatureWeatherDescription; public override KeyCode Key { get; set; } = KeyCode.None; diff --git a/Features/WorldInteractiveObjects.cs b/Features/WorldInteractiveObjects.cs index a7aac500..8a289e99 100644 --- a/Features/WorldInteractiveObjects.cs +++ b/Features/WorldInteractiveObjects.cs @@ -1,5 +1,6 @@ using EFT.Interactive; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -10,8 +11,8 @@ namespace EFT.Trainer.Features; [UsedImplicitly] internal class WorldInteractiveObjects : TriggerFeature { - public override string Name => "opener"; - public override string Description => "Door/Keycard reader/Car unlocker."; + public override string Name => Strings.FeatureWorldInteractiveObjectsName; + public override string Description => Strings.FeatureWorldInteractiveObjectsDescription; public override KeyCode Key { get; set; } = KeyCode.KeypadPeriod; diff --git a/Installer/Compiler.cs b/Installer/Compiler.cs index 3755e5b4..517b4b6b 100644 --- a/Installer/Compiler.cs +++ b/Installer/Compiler.cs @@ -167,7 +167,7 @@ public CSharpCompilation Compile(string assemblyName) return CSharpCompilation.Create(assemblyName, syntaxTrees, references, CompilationOptions); } - [GeneratedRegex(".*)\"\\s*/>")] + [GeneratedRegex(".*)\"\\s*/?>")] private static partial Regex CompileFileRegex(); [GeneratedRegex("<(Project)?Reference\\s+Include=\"(?.*)\"\\s*/?>")] diff --git a/NLog.EFT.Trainer.csproj b/NLog.EFT.Trainer.csproj index 2f98022a..85973aac 100644 --- a/NLog.EFT.Trainer.csproj +++ b/NLog.EFT.Trainer.csproj @@ -209,6 +209,11 @@ + + True + True + Strings.resx + @@ -222,6 +227,13 @@ + + + ResXFileCodeGenerator + Strings.Designer.cs + Designer + + copy /Y "$(TargetPath)" "$(EFTManagedPath)" diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs new file mode 100644 index 00000000..7ac28ca9 --- /dev/null +++ b/Properties/Strings.Designer.cs @@ -0,0 +1,1818 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace EFT.Trainer.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("EFT.Trainer.Properties.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Load settings. + /// + internal static string CommandLoadDescription { + get { + return ResourceManager.GetString("CommandLoadDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to load. + /// + internal static string CommandLoadName { + get { + return ResourceManager.GetString("CommandLoadName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save settings. + /// + internal static string CommandSaveDescription { + get { + return ResourceManager.GetString("CommandSaveDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to save. + /// + internal static string CommandSaveName { + get { + return ResourceManager.GetString("CommandSaveName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Patched {0} with {1}. + /// + internal static string DebugPatchedMethodFormat { + get { + return ResourceManager.GetString("DebugPatchedMethodFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to E. + /// + internal static string DirectionEast { + get { + return ResourceManager.GetString("DirectionEast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to N. + /// + internal static string DirectionNorth { + get { + return ResourceManager.GetString("DirectionNorth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NE. + /// + internal static string DirectionNorthEast { + get { + return ResourceManager.GetString("DirectionNorthEast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NW. + /// + internal static string DirectionNorthWest { + get { + return ResourceManager.GetString("DirectionNorthWest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to S. + /// + internal static string DirectionSouth { + get { + return ResourceManager.GetString("DirectionSouth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SE. + /// + internal static string DirectionSouthEast { + get { + return ResourceManager.GetString("DirectionSouthEast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SW. + /// + internal static string DirectionSouthWest { + get { + return ResourceManager.GetString("DirectionSouthWest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to W. + /// + internal static string DirectionWest { + get { + return ResourceManager.GetString("DirectionWest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot find original method {0}. + /// + internal static string ErrorCannotFindOriginalMethodFormat { + get { + return ResourceManager.GetString("ErrorCannotFindOriginalMethodFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot find postfix method {0}. + /// + internal static string ErrorCannotFindPostfixMethodFormat { + get { + return ResourceManager.GetString("ErrorCannotFindPostfixMethodFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot find prefix method {0}. + /// + internal static string ErrorCannotFindPrefixMethodFormat { + get { + return ResourceManager.GetString("ErrorCannotFindPrefixMethodFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unsupported type: {0}. + /// + internal static string ErrorUnsupportedTypeFormat { + get { + return ResourceManager.GetString("ErrorUnsupportedTypeFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Aimbot. Automatic aiming and/or shooting (SilentAim).. + /// + internal static string FeatureAimbotDescription { + get { + return ResourceManager.GetString("FeatureAimbotDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to aimbot. + /// + internal static string FeatureAimbotName { + get { + return ResourceManager.GetString("FeatureAimbotName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlimited ammo.. + /// + internal static string FeatureAmmunitionDescription { + get { + return ResourceManager.GetString("FeatureAmmunitionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ammo. + /// + internal static string FeatureAmmunitionName { + get { + return ResourceManager.GetString("FeatureAmmunitionName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate.. + /// + internal static string FeatureAutomaticGunDescription { + get { + return ResourceManager.GetString("FeatureAutomaticGunDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to autogun. + /// + internal static string FeatureAutomaticGunName { + get { + return ResourceManager.GetString("FeatureAutomaticGunName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Free camera with fast mode and teleportation.. + /// + internal static string FeatureCameraDescription { + get { + return ResourceManager.GetString("FeatureCameraDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to camera. + /// + internal static string FeatureCameraName { + get { + return ResourceManager.GetString("FeatureCameraName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This main popup window.. + /// + internal static string FeatureCommandsDescription { + get { + return ResourceManager.GetString("FeatureCommandsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to commands. + /// + internal static string FeatureCommandsName { + get { + return ResourceManager.GetString("FeatureCommandsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Crosshair with customizable size, color, thickness and auto-hide feature when aiming.. + /// + internal static string FeatureCrosshairDescription { + get { + return ResourceManager.GetString("FeatureCrosshairDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to crosshair. + /// + internal static string FeatureCrosshairName { + get { + return ResourceManager.GetString("FeatureCrosshairName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum durability of items.. + /// + internal static string FeatureDurabilityDescription { + get { + return ResourceManager.GetString("FeatureDurabilityDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to durability. + /// + internal static string FeatureDurabilityName { + get { + return ResourceManager.GetString("FeatureDurabilityName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All items already examined. Instant search.. + /// + internal static string FeatureExamineDescription { + get { + return ResourceManager.GetString("FeatureExamineDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to examine. + /// + internal static string FeatureExamineName { + get { + return ResourceManager.GetString("FeatureExamineName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exfiltration points with customizable colors given eligibility, status filter, distance.. + /// + internal static string FeatureExfiltrationPointsDescription { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to exfil. + /// + internal static string FeatureExfiltrationPointsName { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Activate. + /// + internal static string FeatureExfiltrationPointsStatusActivate { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusActivate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Closed. + /// + internal static string FeatureExfiltrationPointsStatusClosed { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusClosed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open. + /// + internal static string FeatureExfiltrationPointsStatusOpen { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pending. + /// + internal static string FeatureExfiltrationPointsStatusPending { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusPending", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Requirement. + /// + internal static string FeatureExfiltrationPointsStatusRequirement { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusRequirement", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timer. + /// + internal static string FeatureExfiltrationPointsStatusTimer { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsStatusTimer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet.. + /// + internal static string FeatureFeatureWallShootDescription { + get { + return ResourceManager.GetString("FeatureFeatureWallShootDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change Field Of View (FOV).. + /// + internal static string FeatureFovChangerDescription { + get { + return ResourceManager.GetString("FeatureFovChangerDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to fovchanger. + /// + internal static string FeatureFovChangerName { + get { + return ResourceManager.GetString("FeatureFovChangerName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Refresh all game information for other features.. + /// + internal static string FeatureGameStateDescription { + get { + return ResourceManager.GetString("FeatureGameStateDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to gamestate. + /// + internal static string FeatureGameStateName { + get { + return ResourceManager.GetString("FeatureGameStateName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop bots from seeing you.. + /// + internal static string FeatureGhostDescription { + get { + return ResourceManager.GetString("FeatureGhostDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ghost. + /// + internal static string FeatureGhostName { + get { + return ResourceManager.GetString("FeatureGhostName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Grenades outline.. + /// + internal static string FeatureGrenadesDescription { + get { + return ResourceManager.GetString("FeatureGrenadesDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to grenade. + /// + internal static string FeatureGrenadesName { + get { + return ResourceManager.GetString("FeatureGrenadesName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full health, prevent any damage (so even when falling), keep energy and hydration at maximum.. + /// + internal static string FeatureHealthDescription { + get { + return ResourceManager.GetString("FeatureHealthDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to health. + /// + internal static string FeatureHealthName { + get { + return ResourceManager.GetString("FeatureHealthName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hit markers (hit, armor, health with configurable colors).. + /// + internal static string FeatureHitsDescription { + get { + return ResourceManager.GetString("FeatureHitsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to hits. + /// + internal static string FeatureHitsName { + get { + return ResourceManager.GetString("FeatureHitsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HUD (compass, ammo left in chamber / magazine, fire mode, coordinates).. + /// + internal static string FeatureHudDescription { + get { + return ResourceManager.GetString("FeatureHudDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to hud. + /// + internal static string FeatureHudName { + get { + return ResourceManager.GetString("FeatureHudName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change distance for loot/door interaction.. + /// + internal static string FeatureInteractDescription { + get { + return ResourceManager.GetString("FeatureInteractDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to interact. + /// + internal static string FeatureInteractName { + get { + return ResourceManager.GetString("FeatureInteractName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display.. + /// + internal static string FeatureLootItemsDescription { + get { + return ResourceManager.GetString("FeatureLootItemsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to loot. + /// + internal static string FeatureLootItemsName { + get { + return ResourceManager.GetString("FeatureLootItemsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full screen map with radar esp.. + /// + internal static string FeatureMapDescription { + get { + return ResourceManager.GetString("FeatureMapDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to map. + /// + internal static string FeatureMapName { + get { + return ResourceManager.GetString("FeatureMapName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Night vision.. + /// + internal static string FeatureNightVisionDescription { + get { + return ResourceManager.GetString("FeatureNightVisionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to night. + /// + internal static string FeatureNightVisionName { + get { + return ResourceManager.GetString("FeatureNightVisionName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No physical collisions, making you immune to bullets, grenades and barbed wires.. + /// + internal static string FeatureNoCollisionDescription { + get { + return ResourceManager.GetString("FeatureNoCollisionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to nocoll. + /// + internal static string FeatureNoCollisionName { + get { + return ResourceManager.GetString("FeatureNoCollisionName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating.. + /// + internal static string FeatureNoMalfunctionsDescription { + get { + return ResourceManager.GetString("FeatureNoMalfunctionsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to nomal. + /// + internal static string FeatureNoMalfunctionsName { + get { + return ResourceManager.GetString("FeatureNoMalfunctionsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No recoil.. + /// + internal static string FeatureNoRecoilDescription { + get { + return ResourceManager.GetString("FeatureNoRecoilDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to norecoil. + /// + internal static string FeatureNoRecoilName { + get { + return ResourceManager.GetString("FeatureNoRecoilName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No sway.. + /// + internal static string FeatureNoSwayDescription { + get { + return ResourceManager.GetString("FeatureNoSwayDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to nosway. + /// + internal static string FeatureNoSwayName { + get { + return ResourceManager.GetString("FeatureNoSwayName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No visor, so even when using a face shield-visor you won't see it.. + /// + internal static string FeatureNoVisorDescription { + get { + return ResourceManager.GetString("FeatureNoVisorDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to novisor. + /// + internal static string FeatureNoVisorName { + get { + return ResourceManager.GetString("FeatureNoVisorName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance.. + /// + internal static string FeaturePlayersDescription { + get { + return ResourceManager.GetString("FeaturePlayersDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to wallhack. + /// + internal static string FeaturePlayersName { + get { + return ResourceManager.GetString("FeaturePlayersName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Locations for taking/placing quest items. Only items related to your started quests are displayed.. + /// + internal static string FeatureQuestsDescription { + get { + return ResourceManager.GetString("FeatureQuestsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to quest. + /// + internal static string FeatureQuestsName { + get { + return ResourceManager.GetString("FeatureQuestsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quick-throw grenades.. + /// + internal static string FeatureQuickTrowDescription { + get { + return ResourceManager.GetString("FeatureQuickTrowDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to quickthrow. + /// + internal static string FeatureQuickTrowName { + get { + return ResourceManager.GetString("FeatureQuickTrowName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2D radar.. + /// + internal static string FeatureRadarDescription { + get { + return ResourceManager.GetString("FeatureRadarDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to radar. + /// + internal static string FeatureRadarName { + get { + return ResourceManager.GetString("FeatureRadarName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to [summary]. + /// + internal static string FeatureRendererSummary { + get { + return ResourceManager.GetString("FeatureRendererSummary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Welcome to EFT Trainer !. + /// + internal static string FeatureRendererWelcome { + get { + return ResourceManager.GetString("FeatureRendererWelcome", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All skills to Elite level (51) and all weapons mastering to level 3.. + /// + internal static string FeatureSkillsDescription { + get { + return ResourceManager.GetString("FeatureSkillsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to skills. + /// + internal static string FeatureSkillsName { + get { + return ResourceManager.GetString("FeatureSkillsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself.. + /// + internal static string FeatureSpeedDescription { + get { + return ResourceManager.GetString("FeatureSpeedDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to speed. + /// + internal static string FeatureSpeedName { + get { + return ResourceManager.GetString("FeatureSpeedName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlimited stamina.. + /// + internal static string FeatureStaminaDescription { + get { + return ResourceManager.GetString("FeatureStaminaDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to stamina. + /// + internal static string FeatureStaminaName { + get { + return ResourceManager.GetString("FeatureStaminaName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hidden/special stashes like buried barrels, ground caches, air drops or corpses.. + /// + internal static string FeatureStashDescription { + get { + return ResourceManager.GetString("FeatureStashDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to stash. + /// + internal static string FeatureStashName { + get { + return ResourceManager.GetString("FeatureStashName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Thermal vision.. + /// + internal static string FeatureThermalVisionDescription { + get { + return ResourceManager.GetString("FeatureThermalVisionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to thermal. + /// + internal static string FeatureThermalVisionName { + get { + return ResourceManager.GetString("FeatureThermalVisionName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Summon train on compatible maps like Reserve or Lighthouse.. + /// + internal static string FeatureTrainDescription { + get { + return ResourceManager.GetString("FeatureTrainDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to train. + /// + internal static string FeatureTrainName { + get { + return ResourceManager.GetString("FeatureTrainName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to wallshoot. + /// + internal static string FeatureWallShootName { + get { + return ResourceManager.GetString("FeatureWallShootName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear weather.. + /// + internal static string FeatureWeatherDescription { + get { + return ResourceManager.GetString("FeatureWeatherDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to weather. + /// + internal static string FeatureWeatherName { + get { + return ResourceManager.GetString("FeatureWeatherName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Door/Keycard reader/Car unlocker.. + /// + internal static string FeatureWorldInteractiveObjectsDescription { + get { + return ResourceManager.GetString("FeatureWorldInteractiveObjectsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to opener. + /// + internal static string FeatureWorldInteractiveObjectsName { + get { + return ResourceManager.GetString("FeatureWorldInteractiveObjectsName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Armor-damage color. + /// + internal static string PropertyArmorDamageColor { + get { + return ResourceManager.GetString("PropertyArmorDamageColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Backward. + /// + internal static string PropertyBackward { + get { + return ResourceManager.GetString("PropertyBackward", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bear colors. + /// + internal static string PropertyBearColors { + get { + return ResourceManager.GetString("PropertyBearColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Border color. + /// + internal static string PropertyBorderColor { + get { + return ResourceManager.GetString("PropertyBorderColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boss colors. + /// + internal static string PropertyBossColors { + get { + return ResourceManager.GetString("PropertyBossColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Box thickness. + /// + internal static string PropertyBoxThickness { + get { + return ResourceManager.GetString("PropertyBoxThickness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cache time (sec). + /// + internal static string PropertyCacheTimeInSec { + get { + return ResourceManager.GetString("PropertyCacheTimeInSec", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Camera offset. + /// + internal static string PropertyCameraOffset { + get { + return ResourceManager.GetString("PropertyCameraOffset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change time. + /// + internal static string PropertyChangeTime { + get { + return ResourceManager.GetString("PropertyChangeTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Color. + /// + internal static string PropertyColor { + get { + return ResourceManager.GetString("PropertyColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cultist colors. + /// + internal static string PropertyCultistColors { + get { + return ResourceManager.GetString("PropertyCultistColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Display time. + /// + internal static string PropertyDisplayTime { + get { + return ResourceManager.GetString("PropertyDisplayTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Distance. + /// + internal static string PropertyDistance { + get { + return ResourceManager.GetString("PropertyDistance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Eligible color. + /// + internal static string PropertyEligibleColor { + get { + return ResourceManager.GetString("PropertyEligibleColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enabled. + /// + internal static string PropertyEnabled { + get { + return ResourceManager.GetString("PropertyEnabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fade-out time. + /// + internal static string PropertyFadeOutTime { + get { + return ResourceManager.GetString("PropertyFadeOutTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fast mode. + /// + internal static string PropertyFastMode { + get { + return ResourceManager.GetString("PropertyFastMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fast movement speed. + /// + internal static string PropertyFastMovementSpeed { + get { + return ResourceManager.GetString("PropertyFastMovementSpeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Food / water. + /// + internal static string PropertyFoodWater { + get { + return ResourceManager.GetString("PropertyFoodWater", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Forward. + /// + internal static string PropertyForward { + get { + return ResourceManager.GetString("PropertyForward", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fov. + /// + internal static string PropertyFov { + get { + return ResourceManager.GetString("PropertyFov", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fov circle color. + /// + internal static string PropertyFovCircleColor { + get { + return ResourceManager.GetString("PropertyFovCircleColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fov circle thickness. + /// + internal static string PropertyFovCircleThickness { + get { + return ResourceManager.GetString("PropertyFovCircleThickness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fov radius. + /// + internal static string PropertyFovRadius { + get { + return ResourceManager.GetString("PropertyFovRadius", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Free look sensitivity. + /// + internal static string PropertyFreeLookSensitivity { + get { + return ResourceManager.GetString("PropertyFreeLookSensitivity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Grouping Color. + /// + internal static string PropertyGroupingColor { + get { + return ResourceManager.GetString("PropertyGroupingColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Health-damage color. + /// + internal static string PropertyHealthDamageColor { + get { + return ResourceManager.GetString("PropertyHealthDamageColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hide when aiming. + /// + internal static string PropertyHideWhenAiming { + get { + return ResourceManager.GetString("PropertyHideWhenAiming", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hit-marker color. + /// + internal static string PropertyHitMarkerColor { + get { + return ResourceManager.GetString("PropertyHitMarkerColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Info color. + /// + internal static string PropertyInfoColor { + get { + return ResourceManager.GetString("PropertyInfoColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Intensity. + /// + internal static string PropertyIntensity { + get { + return ResourceManager.GetString("PropertyIntensity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key. + /// + internal static string PropertyKey { + get { + return ResourceManager.GetString("PropertyKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Left. + /// + internal static string PropertyLeft { + get { + return ResourceManager.GetString("PropertyLeft", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Marksman colors. + /// + internal static string PropertyMarksmanColors { + get { + return ResourceManager.GetString("PropertyMarksmanColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum distance. + /// + internal static string PropertyMaximumDistance { + get { + return ResourceManager.GetString("PropertyMaximumDistance", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Movement speed. + /// + internal static string PropertyMovementSpeed { + get { + return ResourceManager.GetString("PropertyMovementSpeed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not eligible color. + /// + internal static string PropertyNotEligibleColor { + get { + return ResourceManager.GetString("PropertyNotEligibleColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Not shootable colors. + /// + internal static string PropertyNotShootableColors { + get { + return ResourceManager.GetString("PropertyNotShootableColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radar background. + /// + internal static string PropertyRadarBackground { + get { + return ResourceManager.GetString("PropertyRadarBackground", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radar crosshair. + /// + internal static string PropertyRadarCrosshair { + get { + return ResourceManager.GetString("PropertyRadarCrosshair", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radar percentage. + /// + internal static string PropertyRadarPercentage { + get { + return ResourceManager.GetString("PropertyRadarPercentage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radar range. + /// + internal static string PropertyRadarRange { + get { + return ResourceManager.GetString("PropertyRadarRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Range. + /// + internal static string PropertyRange { + get { + return ResourceManager.GetString("PropertyRange", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rate. + /// + internal static string PropertyRate { + get { + return ResourceManager.GetString("PropertyRate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove negative effects. + /// + internal static string PropertyRemoveNegativeEffects { + get { + return ResourceManager.GetString("PropertyRemoveNegativeEffects", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Right. + /// + internal static string PropertyRight { + get { + return ResourceManager.GetString("PropertyRight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rogue-Usec colors. + /// + internal static string PropertyRogueUsecColors { + get { + return ResourceManager.GetString("PropertyRogueUsecColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scav-assault colors. + /// + internal static string PropertyScavAssaultColors { + get { + return ResourceManager.GetString("PropertyScavAssaultColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scav colors. + /// + internal static string PropertyScavColors { + get { + return ResourceManager.GetString("PropertyScavColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scav-raider colors. + /// + internal static string PropertyScavRaiderColors { + get { + return ResourceManager.GetString("PropertyScavRaiderColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search inside containers. + /// + internal static string PropertySearchInsideContainers { + get { + return ResourceManager.GetString("PropertySearchInsideContainers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search inside corpses. + /// + internal static string PropertySearchInsideCorpses { + get { + return ResourceManager.GetString("PropertySearchInsideCorpses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shootable colors. + /// + internal static string PropertyShootableColors { + get { + return ResourceManager.GetString("PropertyShootableColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show armor damage. + /// + internal static string PropertyShowArmorDamage { + get { + return ResourceManager.GetString("PropertyShowArmorDamage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show bosses. + /// + internal static string PropertyShowBosses { + get { + return ResourceManager.GetString("PropertyShowBosses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show boxes. + /// + internal static string PropertyShowBoxes { + get { + return ResourceManager.GetString("PropertyShowBoxes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show charms. + /// + internal static string PropertyShowCharms { + get { + return ResourceManager.GetString("PropertyShowCharms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show compass. + /// + internal static string PropertyShowCompass { + get { + return ResourceManager.GetString("PropertyShowCompass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show containers. + /// + internal static string PropertyShowContainers { + get { + return ResourceManager.GetString("PropertyShowContainers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show coordinates. + /// + internal static string PropertyShowCoordinates { + get { + return ResourceManager.GetString("PropertyShowCoordinates", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show corpses. + /// + internal static string PropertyShowCorpses { + get { + return ResourceManager.GetString("PropertyShowCorpses", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show cultists. + /// + internal static string PropertyShowCultists { + get { + return ResourceManager.GetString("PropertyShowCultists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show eligible. + /// + internal static string PropertyShowEligible { + get { + return ResourceManager.GetString("PropertyShowEligible", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show fov circle. + /// + internal static string PropertyShowFovCircle { + get { + return ResourceManager.GetString("PropertyShowFovCircle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show health-damage. + /// + internal static string PropertyShowHealthDamage { + get { + return ResourceManager.GetString("PropertyShowHealthDamage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Hit-marker. + /// + internal static string PropertyShowHitMarker { + get { + return ResourceManager.GetString("PropertyShowHitMarker", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show infos. + /// + internal static string PropertyShowInfos { + get { + return ResourceManager.GetString("PropertyShowInfos", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show map. + /// + internal static string PropertyShowMap { + get { + return ResourceManager.GetString("PropertyShowMap", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show marksmen. + /// + internal static string PropertyShowMarksmen { + get { + return ResourceManager.GetString("PropertyShowMarksmen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show not eligible. + /// + internal static string PropertyShowNotEligible { + get { + return ResourceManager.GetString("PropertyShowNotEligible", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show not shootable. + /// + internal static string PropertyShowNotShootable { + get { + return ResourceManager.GetString("PropertyShowNotShootable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show players. + /// + internal static string PropertyShowPlayers { + get { + return ResourceManager.GetString("PropertyShowPlayers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show prices. + /// + internal static string PropertyShowPrices { + get { + return ResourceManager.GetString("PropertyShowPrices", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show rogues. + /// + internal static string PropertyShowRogues { + get { + return ResourceManager.GetString("PropertyShowRogues", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Scav-assaults. + /// + internal static string PropertyShowScavAssaults { + get { + return ResourceManager.GetString("PropertyShowScavAssaults", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Scav-raiders. + /// + internal static string PropertyShowScavRaiders { + get { + return ResourceManager.GetString("PropertyShowScavRaiders", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Scavs. + /// + internal static string PropertyShowScavs { + get { + return ResourceManager.GetString("PropertyShowScavs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show shootable. + /// + internal static string PropertyShowShootable { + get { + return ResourceManager.GetString("PropertyShowShootable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show skeletons. + /// + internal static string PropertyShowSkeletons { + get { + return ResourceManager.GetString("PropertyShowSkeletons", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Silent aim. + /// + internal static string PropertySilentAim { + get { + return ResourceManager.GetString("PropertySilentAim", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Silent aim next-shot-delay. + /// + internal static string PropertySilentAimNextShotDelay { + get { + return ResourceManager.GetString("PropertySilentAimNextShotDelay", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Silent aim speed-factor. + /// + internal static string PropertySilentAimSpeedFactor { + get { + return ResourceManager.GetString("PropertySilentAimSpeedFactor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Size. + /// + internal static string PropertySize { + get { + return ResourceManager.GetString("PropertySize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skeleton thickness. + /// + internal static string PropertySkeletonThickness { + get { + return ResourceManager.GetString("PropertySkeletonThickness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Smoothness. + /// + internal static string PropertySmoothness { + get { + return ResourceManager.GetString("PropertySmoothness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Status filter. + /// + internal static string PropertyStatusFilter { + get { + return ResourceManager.GetString("PropertyStatusFilter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Teleport. + /// + internal static string PropertyTeleport { + get { + return ResourceManager.GetString("PropertyTeleport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Thickness. + /// + internal static string PropertyThickness { + get { + return ResourceManager.GetString("PropertyThickness", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Track Wishlist. + /// + internal static string PropertyTrackWishlist { + get { + return ResourceManager.GetString("PropertyTrackWishlist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Usec colors. + /// + internal static string PropertyUsecColors { + get { + return ResourceManager.GetString("PropertyUsecColors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vitals only. + /// + internal static string PropertyVitalsOnly { + get { + return ResourceManager.GetString("PropertyVitalsOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to X. + /// + internal static string PropertyX { + get { + return ResourceManager.GetString("PropertyX", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to XRay-Vision. + /// + internal static string PropertyXRayVision { + get { + return ResourceManager.GetString("PropertyXRayVision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Y. + /// + internal static string PropertyY { + get { + return ResourceManager.GetString("PropertyY", resourceCulture); + } + } + } +} diff --git a/Properties/Strings.resx b/Properties/Strings.resx new file mode 100644 index 00000000..999c384d --- /dev/null +++ b/Properties/Strings.resx @@ -0,0 +1,710 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + aimbot + + + Aimbot. Automatic aiming and/or shooting (SilentAim). + + + ammo + + + Unlimited ammo. + + + autogun + + + Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate. + + + N + + + NE + + + E + + + SE + + + Patched {0} with {1} + Method names + + + S + + + SW + + + W + + + NW + + + commands + + + This main popup window. + + + load + + + save + + + crosshair + + + Crosshair with customizable size, color, thickness and auto-hide feature when aiming. + + + durability + + + Maximum durability of items. + + + examine + + + All items already examined. Instant search. + + + exfil + + + Exfiltration points with customizable colors given eligibility, status filter, distance. + + + Activate + + + Timer + + + Closed + + + Pending + + + Open + + + Requirement + + + Cannot find original method {0} + Method name + + + Cannot find prefix method {0} + Method name + + + Cannot find postfix method {0} + Method name + + + [summary] + + + Welcome to EFT Trainer ! + + + Load settings + + + Save settings + + + Unsupported type: {0} + Property type-name + + + fovchanger + + + Change Field Of View (FOV). + + + camera + + + Free camera with fast mode and teleportation. + + + gamestate + + + Refresh all game information for other features. + + + ghost + + + Stop bots from seeing you. + + + grenade + + + Grenades outline. + + + health + + + Full health, prevent any damage (so even when falling), keep energy and hydration at maximum. + + + hits + + + Hit markers (hit, armor, health with configurable colors). + + + hud + + + HUD (compass, ammo left in chamber / magazine, fire mode, coordinates). + + + interact + + + Change distance for loot/door interaction. + + + stash + + + Hidden/special stashes like buried barrels, ground caches, air drops or corpses. + + + loot + + + List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display. + + + map + + + Full screen map with radar esp. + + + night + + + Night vision. + + + nocoll + + + No physical collisions, making you immune to bullets, grenades and barbed wires. + + + nomal + + + No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating. + + + norecoil + + + No recoil. + + + nosway + + + No sway. + + + novisor + + + No visor, so even when using a face shield-visor you won't see it. + + + wallhack + + + Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance. + + + quest + + + Locations for taking/placing quest items. Only items related to your started quests are displayed. + + + quickthrow + + + Quick-throw grenades. + + + radar + + + 2D radar. + + + skills + + + All skills to Elite level (51) and all weapons mastering to level 3. + + + speed + + + Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself. + + + stamina + + + Unlimited stamina. + + + thermal + + + Thermal vision. + + + train + + + Summon train on compatible maps like Reserve or Lighthouse. + + + wallshoot + + + Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet. + + + weather + + + Clear weather. + + + opener + + + Door/Keycard reader/Car unlocker. + + + Armor-damage color + + + Backward + + + Cache time (sec) + + + Change time + + + Color + + + Display time + + + Distance + + + Eligible color + + + Enabled + + + Fade-out time + + + Fast mode + + + Fast movement speed + + + Food / water + + + Forward + + + Fov + + + Fov circle color + + + Fov circle thickness + + + Fov radius + + + Free look sensitivity + + + Grouping Color + + + Health-damage color + + + Hide when aiming + + + Hit-marker color + + + Key + + + Left + + + Maximum distance + + + Movement speed + + + Not eligible color + + + Rate + + + Remove negative effects + + + Right + + + Show armor damage + + + Show bosses + + + Show compass + + + Show coordinates + + + Show cultists + + + Show eligible + + + Show fov circle + + + Show health-damage + + + Show Hit-marker + + + Show marksmen + + + Show not eligible + + + Show players + + + Show rogues + + + Show Scav-assaults + + + Show Scav-raiders + + + Show Scavs + + + Silent aim + + + Silent aim next-shot-delay + + + Silent aim speed-factor + + + Size + + + Smoothness + + + Status filter + + + Teleport + + + Thickness + + + Vitals only + + + X + + + Y + + + Bear colors + + + Border color + + + Boss colors + + + Box thickness + + + Cultist colors + + + Info color + + + Intensity + + + Marksman colors + + + Not shootable colors + + + Radar background + + + Radar crosshair + + + Radar percentage + + + Radar range + + + Range + + + Rogue-Usec colors + + + Scav-assault colors + + + Scav colors + + + Scav-raider colors + + + Search inside containers + + + Search inside corpses + + + Shootable colors + + + Show boxes + + + Show charms + + + Show containers + + + Show corpses + + + Show infos + + + Show map + + + Show not shootable + + + Show prices + + + Show shootable + + + Show skeletons + + + Skeleton thickness + + + Track Wishlist + + + Usec colors + + + XRay-Vision + + + Camera offset + + \ No newline at end of file From c1de9be2dc9c7257b8fb8cdb8772a913e2165920 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Tue, 9 Jul 2024 18:22:42 +0200 Subject: [PATCH 02/21] Extract more strings --- Configuration/ConfigurationManager.cs | 27 +- Configuration/TrackedItemConverter.cs | 3 +- ConsoleCommands/BaseListCommand.cs | 7 +- ConsoleCommands/ConsoleCommandWithArgument.cs | 5 +- .../ConsoleCommandWithoutArgument.cs | 5 +- ConsoleCommands/Dump.cs | 9 +- ConsoleCommands/List.cs | 5 +- ConsoleCommands/ListRare.cs | 5 +- ConsoleCommands/ListSuperRare.cs | 5 +- ConsoleCommands/LoadTrackList.cs | 3 +- ConsoleCommands/SaveTrackList.cs | 3 +- ConsoleCommands/Spawn.cs | 13 +- ConsoleCommands/Status.cs | 9 +- ConsoleCommands/Template.cs | 9 +- ConsoleCommands/ToggleFeatureCommand.cs | 11 +- ConsoleCommands/Track.cs | 5 +- ConsoleCommands/TrackList.cs | 9 +- ConsoleCommands/TrackRare.cs | 5 +- ConsoleCommands/TrackSuperRare.cs | 5 +- ConsoleCommands/UnTrack.cs | 3 +- Features/CachableFeature.cs | 2 +- Features/Commands.cs | 2 +- Features/ExfiltrationPoints.cs | 12 +- Features/Feature.cs | 2 +- Features/FeatureRenderer.cs | 4 +- Features/Hud.cs | 18 +- Properties/Strings.Designer.cs | 424 +++++++++++++++++- Properties/Strings.resx | 168 ++++++- 28 files changed, 685 insertions(+), 93 deletions(-) diff --git a/Configuration/ConfigurationManager.cs b/Configuration/ConfigurationManager.cs index ebb4fc69..b7da5a0e 100644 --- a/Configuration/ConfigurationManager.cs +++ b/Configuration/ConfigurationManager.cs @@ -4,6 +4,7 @@ using System.Reflection; using System.Text; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using EFT.UI; using Newtonsoft.Json; @@ -54,16 +55,16 @@ public static void Load(string filename, Feature[] features, bool warnIfNotExist } catch (JsonException) { - AddConsoleLog($"{key} seems corrupted in {filename}. Please fix.".Red()); + AddConsoleLog(string.Format(Strings.ErrorCorruptedPropertyFormat, key, filename).Red()); } } } - AddConsoleLog($"Loaded {filename}"); + AddConsoleLog(string.Format(Strings.CommandLoadSuccessFormat, filename)); } catch (Exception ioe) { - AddConsoleLog($"Unable to load {filename}. {ioe.Message}".Red()); + AddConsoleLog(string.Format(Strings.ErrorUnableToLoadFormat, filename, ioe.Message).Red()); } } @@ -73,7 +74,7 @@ public static void LoadPropertyValue(string filename, Feature feature, string pr { if (!File.Exists(filename)) { - AddConsoleLog($"{filename} not found!"); + AddConsoleLog(string.Format(Strings.ErrorFileNotFoundFormat, filename).Red()); return; } @@ -89,14 +90,14 @@ public static void LoadPropertyValue(string filename, Feature feature, string pr } catch (JsonException) { - AddConsoleLog($"{filename} seems corrupted. Please fix.".Red()); + AddConsoleLog(string.Format(Strings.ErrorCorruptedFileFormat, filename).Red()); } - AddConsoleLog($"Loaded {filename}"); + AddConsoleLog(string.Format(Strings.CommandLoadSuccessFormat, filename)); } catch (Exception ioe) { - AddConsoleLog($"Unable to load {filename}. {ioe.Message}".Red()); + AddConsoleLog(string.Format(Strings.ErrorUnableToLoadFormat, filename, ioe.Message).Red()); } } @@ -105,9 +106,7 @@ public static void Save(string filename, Feature[] features) try { var content = new StringBuilder(); - content.AppendLine("; Be careful when updating this file :)"); - content.AppendLine("; For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html"); - content.AppendLine("; Colors are stored as an array of 'RGBA' floats"); + content.AppendLine(Strings.CommandSaveHeader); content.AppendLine(); foreach (var feature in features.OrderBy(f => f.GetType().FullName)) @@ -132,11 +131,11 @@ public static void Save(string filename, Feature[] features) } File.WriteAllText(filename, content.ToString()); - AddConsoleLog($"Saved {filename}"); + AddConsoleLog(string.Format(Strings.CommandSaveSuccessFormat, filename)); } catch (Exception ioe) { - AddConsoleLog($"Unable to save {filename}. {ioe.Message}".Red()); + AddConsoleLog(string.Format(Strings.ErrorUnableToSaveFormat, filename, ioe.Message).Red()); } } @@ -150,11 +149,11 @@ public static void SavePropertyValue(string filename, Feature feature, string pr var content = JsonConvert.SerializeObject(tlProperty.Property.GetValue(feature), Formatting.Indented, Converters); File.WriteAllText(filename, content); - AddConsoleLog($"Saved {filename}"); + AddConsoleLog(string.Format(Strings.CommandSaveSuccessFormat, filename)); } catch (Exception ioe) { - AddConsoleLog($"Unable to save {filename}. {ioe.Message}".Red()); + AddConsoleLog(string.Format(Strings.ErrorUnableToSaveFormat, filename, ioe.Message).Red()); } } diff --git a/Configuration/TrackedItemConverter.cs b/Configuration/TrackedItemConverter.cs index 0d609b58..8045f1ef 100644 --- a/Configuration/TrackedItemConverter.cs +++ b/Configuration/TrackedItemConverter.cs @@ -1,5 +1,6 @@ using System; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -27,7 +28,7 @@ public override object ReadJson(JsonReader reader, Type objectType, object? exis { string name => new TrackedItem(name), JObject jobject => jobject.ToObject()!, - _ => new TrackedItem("corrupted trainer.ini") + _ => new TrackedItem(string.Format(Strings.ErrorCorruptedFileFormat, "trainer.ini")) }; } diff --git a/ConsoleCommands/BaseListCommand.cs b/ConsoleCommands/BaseListCommand.cs index 27c23696..b419afba 100644 --- a/ConsoleCommands/BaseListCommand.cs +++ b/ConsoleCommands/BaseListCommand.cs @@ -7,6 +7,7 @@ using EFT.InventoryLogic; using EFT.Trainer.Extensions; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using JsonType; #nullable enable @@ -63,13 +64,13 @@ private void ListLootItems(Match match, ELootRarity? rarityFilter = null) continue; var extra = rarity != ELootRarity.Not_exist ? $" ({rarity.Color()})" : string.Empty; - AddConsoleLog($"{itemName} [{list.Count.ToString().Cyan()}]{extra}"); + AddConsoleLog(string.Format(Strings.CommandListEnumerateFormat, itemName, list.Count.ToString().Cyan(), extra)); count += list.Count; } - AddConsoleLog("------"); - AddConsoleLog($"found {count.ToString().Cyan()} item(s)"); + AddConsoleLog(Strings.TextSeparator); + AddConsoleLog(string.Format(Strings.CommandListSuccessFormat, count.ToString().Cyan())); } private static void FindItemsInRootItem(Dictionary> itemsPerName, Item? rootItem) diff --git a/ConsoleCommands/ConsoleCommandWithArgument.cs b/ConsoleCommands/ConsoleCommandWithArgument.cs index 9278d20f..9061d0ee 100644 --- a/ConsoleCommands/ConsoleCommandWithArgument.cs +++ b/ConsoleCommands/ConsoleCommandWithArgument.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using EFT.Trainer.Properties; using EFT.UI; #nullable enable @@ -20,7 +21,7 @@ internal abstract class ConsoleCommandWithArgument : ConsoleCommand public override void Register() { #if DEBUG - AddConsoleLog($"Registering {Name} command with arguments..."); + AddConsoleLog(string.Format(Strings.DebugRegisteringCommandWithArgumentsFormat, Name)); #endif ConsoleScreen.Processor.RegisterCommand(Name, (string args) => { @@ -31,7 +32,7 @@ public override void Register() } else { - ConsoleScreen.LogError("Invalid arguments"); + AddConsoleLog(Strings.ErrorInvalidArguments.Red()); } }); } diff --git a/ConsoleCommands/ConsoleCommandWithoutArgument.cs b/ConsoleCommands/ConsoleCommandWithoutArgument.cs index 4c043726..9c1c9f0e 100644 --- a/ConsoleCommands/ConsoleCommandWithoutArgument.cs +++ b/ConsoleCommands/ConsoleCommandWithoutArgument.cs @@ -1,4 +1,5 @@ -using EFT.UI; +using EFT.Trainer.Properties; +using EFT.UI; #nullable enable @@ -11,7 +12,7 @@ internal abstract class ConsoleCommandWithoutArgument : ConsoleCommand public override void Register() { #if DEBUG - AddConsoleLog($"Registering {Name} command..."); + AddConsoleLog(string.Format(Strings.DebugRegisteringCommandFormat, Name)); #endif ConsoleScreen.Processor.RegisterCommand(Name, Execute); } diff --git a/ConsoleCommands/Dump.cs b/ConsoleCommands/Dump.cs index b0ec9e84..3a27509d 100644 --- a/ConsoleCommands/Dump.cs +++ b/ConsoleCommands/Dump.cs @@ -1,6 +1,7 @@ using System; using System.IO; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; using UnityEngine.SceneManagement; @@ -12,7 +13,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Dump : ConsoleCommandWithoutArgument { - public override string Name => "dump"; + public override string Name => Strings.CommandDump; public override void Execute() { @@ -21,7 +22,7 @@ public override void Execute() Directory.CreateDirectory(thisDump); - AddConsoleLog("Dumping scenes..."); + AddConsoleLog(Strings.CommandDumpScenes); for (int i = 0; i < SceneManager.sceneCount; i++) { var scene = SceneManager.GetSceneAt(i); @@ -32,7 +33,7 @@ public override void Execute() File.WriteAllText(Path.Combine(thisDump, GetSafeFilename($"@scene - {scene.name}.txt")), json); } - AddConsoleLog("Dumping game objects..."); + AddConsoleLog(Strings.CommandDumpGameObjects); foreach (var go in UnityEngine.Object.FindObjectsOfType()) { if (go == null || go.transform.parent != null || !go.activeSelf) @@ -43,7 +44,7 @@ public override void Execute() File.WriteAllText(Path.Combine(thisDump, filename), json); } - AddConsoleLog($"Dump created in {thisDump}"); + AddConsoleLog(string.Format(Strings.CommandDumpSuccessFormat, thisDump)); } private static string GetSafeFilename(string filename) diff --git a/ConsoleCommands/List.cs b/ConsoleCommands/List.cs index 2f364ec6..580a7914 100644 --- a/ConsoleCommands/List.cs +++ b/ConsoleCommands/List.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; #nullable enable @@ -7,5 +8,5 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class List : BaseListCommand { - public override string Name => "list"; + public override string Name => Strings.CommandList; } diff --git a/ConsoleCommands/ListRare.cs b/ConsoleCommands/ListRare.cs index 5d297226..200330ec 100644 --- a/ConsoleCommands/ListRare.cs +++ b/ConsoleCommands/ListRare.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using JsonType; #nullable enable @@ -8,6 +9,6 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class ListRare : BaseListCommand { - public override string Name => "listr"; + public override string Name => Strings.CommandListRare; protected override ELootRarity? Rarity => ELootRarity.Rare; } diff --git a/ConsoleCommands/ListSuperRare.cs b/ConsoleCommands/ListSuperRare.cs index 2dedb987..02b4628d 100644 --- a/ConsoleCommands/ListSuperRare.cs +++ b/ConsoleCommands/ListSuperRare.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using JsonType; #nullable enable @@ -8,6 +9,6 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class ListSuperRare : BaseListCommand { - public override string Name => "listsr"; + public override string Name => Strings.CommandListSuperRare; protected override ELootRarity? Rarity => ELootRarity.Superrare; } diff --git a/ConsoleCommands/LoadTrackList.cs b/ConsoleCommands/LoadTrackList.cs index aeef24d3..42178aa5 100644 --- a/ConsoleCommands/LoadTrackList.cs +++ b/ConsoleCommands/LoadTrackList.cs @@ -1,5 +1,6 @@ using System.Text.RegularExpressions; using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -9,7 +10,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class LoadTrackList : BaseTrackListCommand { - public override string Name => "loadtl"; + public override string Name => Strings.CommandLoadTrackList; public override void Execute(Match match) { diff --git a/ConsoleCommands/SaveTrackList.cs b/ConsoleCommands/SaveTrackList.cs index 4129cfb3..a1474c91 100644 --- a/ConsoleCommands/SaveTrackList.cs +++ b/ConsoleCommands/SaveTrackList.cs @@ -1,5 +1,6 @@ using System.Text.RegularExpressions; using EFT.Trainer.Configuration; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -9,7 +10,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class SaveTrackList : BaseTrackListCommand { - public override string Name => "savetl"; + public override string Name => Strings.CommandSaveTrackList; public override void Execute(Match match) { diff --git a/ConsoleCommands/Spawn.cs b/ConsoleCommands/Spawn.cs index 8da25ba1..f59e2bd0 100644 --- a/ConsoleCommands/Spawn.cs +++ b/ConsoleCommands/Spawn.cs @@ -6,6 +6,7 @@ using EFT.CameraControl; using EFT.Trainer.Extensions; using EFT.Trainer.Features; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -15,7 +16,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Spawn : BaseTemplateCommand { - public override string Name => "spawn"; + public override string Name => Strings.CommandSpawn; public override void Execute(Match match) { @@ -33,14 +34,14 @@ public override void Execute(Match match) switch (templates.Length) { case 0: - AddConsoleLog("No template found!"); + AddConsoleLog(Strings.ErrorNoTemplateFound.Red()); return; case > 1: { foreach (var template in templates) - AddConsoleLog($"{template._id}: {template.ShortNameLocalizationKey.Localized().Green()} [{template.NameLocalizationKey.Localized()}]"); + AddConsoleLog(string.Format(Strings.CommandTemplateEnumerateFormat, template._id, template.ShortNameLocalizationKey.Localized().Green(), template.NameLocalizationKey.Localized())); - AddConsoleLog($"found {templates.Length.ToString().Cyan()} templates, be more specific"); + AddConsoleLog(string.Format(Strings.ErrorTooManyTemplatesFormat, templates.Length.ToString().Cyan())); return; } } @@ -56,7 +57,7 @@ public override void Execute(Match match) { if (task.IsFaulted) { - AddConsoleLog("Failed to load item bundle!"); + AddConsoleLog(Strings.ErrorFailedToLoadItemBundle.Red()); } else { @@ -64,7 +65,7 @@ public override void Execute(Match match) var item = itemFactory.CreateItem(MongoID.Generate(), tpl._id, null); if (item == null) { - AddConsoleLog("Failed to create item!"); + AddConsoleLog(Strings.ErrorFailedToCreateItem.Red()); } else { diff --git a/ConsoleCommands/Status.cs b/ConsoleCommands/Status.cs index 3b3daa3a..37968eac 100644 --- a/ConsoleCommands/Status.cs +++ b/ConsoleCommands/Status.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Features; +using EFT.Trainer.Properties; using JetBrains.Annotations; using UnityEngine; @@ -9,12 +10,14 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Status : ConsoleCommandWithoutArgument { - public override string Name => "status"; + public override string Name => Strings.CommandStatus; private static string GetFeatureHelpText(ToggleFeature feature) { - var toggleKey = feature.Key != KeyCode.None ? $" ({feature.Key} to toggle)" : string.Empty; - return $"{feature.Name} is {(feature.Enabled ? "on".Green() : "off".Red())}{toggleKey}"; + var toggleKey = feature.Key != KeyCode.None ? string.Format(Strings.CommandStatusTextToggleFormat, feature.Key) : string.Empty; + return string + .Format(Strings.CommandStatusTextFormat, feature.Name, feature.Enabled ? Strings.TextOn.Green() : Strings.TextOff.Red(), toggleKey) + .Trim(); } public override void Execute() diff --git a/ConsoleCommands/Template.cs b/ConsoleCommands/Template.cs index 01a4945a..948d5f46 100644 --- a/ConsoleCommands/Template.cs +++ b/ConsoleCommands/Template.cs @@ -2,6 +2,7 @@ using System.Text.RegularExpressions; using Comfort.Common; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -11,7 +12,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Template : BaseTemplateCommand { - public override string Name => "template"; + public override string Name => Strings.CommandTemplate; public override void Execute(Match match) { @@ -27,9 +28,9 @@ public override void Execute(Match match) var templates = FindTemplates(search).ToArray(); foreach (var template in templates) - AddConsoleLog($"{template._id}: {template.ShortNameLocalizationKey.Localized().Green()} [{template.NameLocalizationKey.Localized()}]"); + AddConsoleLog(string.Format(Strings.CommandTemplateEnumerateFormat, template._id, template.ShortNameLocalizationKey.Localized().Green(), template.NameLocalizationKey.Localized())); - AddConsoleLog("------"); - AddConsoleLog($"found {templates.Length.ToString().Cyan()} template(s)"); + AddConsoleLog(Strings.TextSeparator); + AddConsoleLog(string.Format(Strings.CommandTemplateSuccessFormat, templates.Length.ToString().Cyan())); } } diff --git a/ConsoleCommands/ToggleFeatureCommand.cs b/ConsoleCommands/ToggleFeatureCommand.cs index e9d0405c..f4274f67 100644 --- a/ConsoleCommands/ToggleFeatureCommand.cs +++ b/ConsoleCommands/ToggleFeatureCommand.cs @@ -1,5 +1,6 @@ using System.Text.RegularExpressions; using EFT.Trainer.Features; +using EFT.Trainer.Properties; #nullable enable @@ -8,7 +9,7 @@ namespace EFT.Trainer.ConsoleCommands; internal class ToggleFeatureCommand(ToggleFeature feature) : ConsoleCommandWithArgument { public override string Name => feature.Name; - public override string Pattern => $"(?<{ValueGroup}>(on)|(off))"; + public override string Pattern => $"(?<{ValueGroup}>({Strings.TextOn})|({Strings.TextOff}))"; public override void Execute(Match match) { @@ -16,11 +17,7 @@ public override void Execute(Match match) if (matchGroup is not {Success: true}) return; - feature.Enabled = matchGroup.Value switch - { - "on" => true, - "off" => false, - _ => feature.Enabled - }; + var value = matchGroup.Value; + feature.Enabled = value == Strings.TextOn; } } diff --git a/ConsoleCommands/Track.cs b/ConsoleCommands/Track.cs index 221a2833..41a4638c 100644 --- a/ConsoleCommands/Track.cs +++ b/ConsoleCommands/Track.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; #nullable enable @@ -7,5 +8,5 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class Track : BaseTrackCommand { - public override string Name => "track"; + public override string Name => Strings.CommandTrack; } diff --git a/ConsoleCommands/TrackList.cs b/ConsoleCommands/TrackList.cs index 5f0731ee..9adce36b 100644 --- a/ConsoleCommands/TrackList.cs +++ b/ConsoleCommands/TrackList.cs @@ -1,4 +1,5 @@ using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -8,7 +9,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class TrackList : ConsoleCommandWithoutArgument { - public override string Name => "tracklist"; + public override string Name => Strings.CommandTrackList; public override void Execute() { @@ -19,15 +20,15 @@ public override void Execute() internal static void ShowTrackList(ConsoleCommand command, Features.LootItems lootItems, bool changed = false) { if (changed) - command.AddConsoleLog("Tracking list updated..."); + command.AddConsoleLog(Strings.CommandTrackListUpdated); foreach (var templateId in lootItems.Wishlist) - command.AddConsoleLog($"Tracking: {templateId.LocalizedShortName()} (Wishlist)"); + command.AddConsoleLog(string.Format(Strings.CommandTrackListWishListEnumerateFormat, templateId.LocalizedShortName())); foreach (var item in lootItems.TrackedNames) { var extra = item.Rarity.HasValue ? $" ({item.Rarity.Value.Color()})" : string.Empty; - command.AddConsoleLog(item.Color.HasValue ? $"Tracking: {item.Name.Color(item.Color.Value)}{extra}" : $"Tracking: {item.Name}{extra}"); + command.AddConsoleLog(string.Format(Strings.CommandTemplateEnumerateFormat, item.Color.HasValue ? item.Name.Color(item.Color.Value) : item.Name, extra)); } } } diff --git a/ConsoleCommands/TrackRare.cs b/ConsoleCommands/TrackRare.cs index 58dfd6d4..06292f33 100644 --- a/ConsoleCommands/TrackRare.cs +++ b/ConsoleCommands/TrackRare.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using JsonType; #nullable enable @@ -8,6 +9,6 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class TrackRare : BaseTrackCommand { - public override string Name => "trackr"; + public override string Name => Strings.CommandTrackRare; protected override ELootRarity? Rarity => ELootRarity.Rare; } diff --git a/ConsoleCommands/TrackSuperRare.cs b/ConsoleCommands/TrackSuperRare.cs index 8d76abdd..91cce15d 100644 --- a/ConsoleCommands/TrackSuperRare.cs +++ b/ConsoleCommands/TrackSuperRare.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using EFT.Trainer.Properties; +using JetBrains.Annotations; using JsonType; #nullable enable @@ -8,6 +9,6 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class TrackSuperRare : BaseTrackCommand { - public override string Name => "tracksr"; + public override string Name => Strings.CommandTrackSuperRare; protected override ELootRarity? Rarity => ELootRarity.Superrare; } diff --git a/ConsoleCommands/UnTrack.cs b/ConsoleCommands/UnTrack.cs index 8a893ff8..9f124473 100644 --- a/ConsoleCommands/UnTrack.cs +++ b/ConsoleCommands/UnTrack.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using EFT.Trainer.Properties; using JetBrains.Annotations; #nullable enable @@ -8,7 +9,7 @@ namespace EFT.Trainer.ConsoleCommands; [UsedImplicitly] internal class UnTrack : BaseTrackCommand { - public override string Name => "untrack"; + public override string Name => Strings.CommandUnTrack; public override void Execute(Match match) { diff --git a/Features/CachableFeature.cs b/Features/CachableFeature.cs index 8e0d6034..271f8ffa 100644 --- a/Features/CachableFeature.cs +++ b/Features/CachableFeature.cs @@ -53,7 +53,7 @@ private IEnumerator RefreshDataScheduler() } #if DEBUG_PERFORMANCE - AddConsoleLog($"Refreshed {GetType().Name} in {_stopwatch.ElapsedMilliseconds}ms"); + AddConsoleLog(string.Format(EFT.Trainer.Properties.Strings.DebugPerformanceRefreshedFormat, GetType().Name, _stopwatch.ElapsedMilliseconds)); #endif } diff --git a/Features/Commands.cs b/Features/Commands.cs index 13aff818..4e1e4c4b 100644 --- a/Features/Commands.cs +++ b/Features/Commands.cs @@ -48,7 +48,7 @@ protected override void Update() private void RegisterPropertyDisplays() { - const string prefix = "Property"; + const string prefix = nameof(OrderedProperty.Property); var properties = typeof(Strings) .GetProperties(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) diff --git a/Features/ExfiltrationPoints.cs b/Features/ExfiltrationPoints.cs index dc65cd02..ba9bdeb6 100644 --- a/Features/ExfiltrationPoints.cs +++ b/Features/ExfiltrationPoints.cs @@ -105,12 +105,12 @@ public static string GetStatus(EExfiltrationStatus status) { return status switch { - EExfiltrationStatus.AwaitsManualActivation => Properties.Strings.FeatureExfiltrationPointsStatusActivate, - EExfiltrationStatus.Countdown => Properties.Strings.FeatureExfiltrationPointsStatusTimer, - EExfiltrationStatus.NotPresent => Properties.Strings.FeatureExfiltrationPointsStatusClosed, - EExfiltrationStatus.Pending => Properties.Strings.FeatureExfiltrationPointsStatusPending, - EExfiltrationStatus.RegularMode => Properties.Strings.FeatureExfiltrationPointsStatusOpen, - EExfiltrationStatus.UncompleteRequirements => Properties.Strings.FeatureExfiltrationPointsStatusRequirement, + EExfiltrationStatus.AwaitsManualActivation => Strings.FeatureExfiltrationPointsStatusActivate, + EExfiltrationStatus.Countdown => Strings.FeatureExfiltrationPointsStatusTimer, + EExfiltrationStatus.NotPresent => Strings.FeatureExfiltrationPointsStatusClosed, + EExfiltrationStatus.Pending => Strings.FeatureExfiltrationPointsStatusPending, + EExfiltrationStatus.RegularMode => Strings.FeatureExfiltrationPointsStatusOpen, + EExfiltrationStatus.UncompleteRequirements => Strings.FeatureExfiltrationPointsStatusRequirement, _ => string.Empty }; } diff --git a/Features/Feature.cs b/Features/Feature.cs index 8cc6adf0..c4b97820 100644 --- a/Features/Feature.cs +++ b/Features/Feature.cs @@ -48,7 +48,7 @@ public void HarmonyPrefix(HarmonyLib.Harmony harmony, Type originalType, string harmony.Patch(original, prefix: new HarmonyLib.HarmonyMethod(prefix)); #if DEBUG - AddConsoleLog($"Patched {originalType}.{originalMethod} with {GetType()}.{newMethod}"); + AddConsoleLog(string.Format(Properties.Strings.DebugPatchedMethodFormat, $"{originalType}.{originalMethod}", $"{GetType()}.{newMethod}")); #endif } diff --git a/Features/FeatureRenderer.cs b/Features/FeatureRenderer.cs index 37d88047..3964e0ce 100644 --- a/Features/FeatureRenderer.cs +++ b/Features/FeatureRenderer.cs @@ -81,7 +81,7 @@ protected override void OnGUIWhenEnabled() SetupInputNode(); _clientWindowRect = new Rect(X, Y, 490, _clientWindowRect.height); - _clientWindowRect = GUILayout.Window(0, _clientWindowRect, RenderFeatureWindow, "EFT Trainer", GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true)); + _clientWindowRect = GUILayout.Window(0, _clientWindowRect, RenderFeatureWindow, Strings.FeatureCommandsTitle , GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true)); X = _clientWindowRect.x; Y = _clientWindowRect.y; @@ -157,7 +157,7 @@ private static string RenderFeatureText(Feature feature) if (feature is not ToggleFeature toggleFeature || ConfigurationManager.IsSkippedProperty(feature, nameof(Enabled))) return feature.Name; - return $"{toggleFeature.Name} is {(toggleFeature.Enabled ? "on".Green() : "off".Red())}"; + return string.Format(Strings.CommandStatusTextFormat, toggleFeature.Enabled ? Strings.TextOn.Green() : Strings.TextOff.Red()); } private void RenderSummary() diff --git a/Features/Hud.cs b/Features/Hud.cs index f3fb135a..e45a76aa 100644 --- a/Features/Hud.cs +++ b/Features/Hud.cs @@ -24,15 +24,15 @@ internal class Hud : ToggleFeature public bool ShowCompass { get; set; } = true; private static readonly string[] _directions = [ - Properties.Strings.DirectionNorth, - Properties.Strings.DirectionNorthEast, - Properties.Strings.DirectionEast, - Properties.Strings.DirectionSouthEast, - Properties.Strings.DirectionSouth, - Properties.Strings.DirectionSouthWest, - Properties.Strings.DirectionWest, - Properties.Strings.DirectionNorthWest, - Properties.Strings.DirectionNorth + Strings.DirectionNorth, + Strings.DirectionNorthEast, + Strings.DirectionEast, + Strings.DirectionSouthEast, + Strings.DirectionSouth, + Strings.DirectionSouthWest, + Strings.DirectionWest, + Strings.DirectionNorthWest, + Strings.DirectionNorth ]; [ConfigurationProperty] diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs index 7ac28ca9..3b1efa39 100644 --- a/Properties/Strings.Designer.cs +++ b/Properties/Strings.Designer.cs @@ -60,6 +60,87 @@ internal Strings() { } } + /// + /// Looks up a localized string similar to dump. + /// + internal static string CommandDump { + get { + return ResourceManager.GetString("CommandDump", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dumping game objects.... + /// + internal static string CommandDumpGameObjects { + get { + return ResourceManager.GetString("CommandDumpGameObjects", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dumping Scenes.... + /// + internal static string CommandDumpScenes { + get { + return ResourceManager.GetString("CommandDumpScenes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dump created in {0}. + /// + internal static string CommandDumpSuccessFormat { + get { + return ResourceManager.GetString("CommandDumpSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to list. + /// + internal static string CommandList { + get { + return ResourceManager.GetString("CommandList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} [{1}]{2}. + /// + internal static string CommandListEnumerateFormat { + get { + return ResourceManager.GetString("CommandListEnumerateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to listr. + /// + internal static string CommandListRare { + get { + return ResourceManager.GetString("CommandListRare", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found {0} item(s). + /// + internal static string CommandListSuccessFormat { + get { + return ResourceManager.GetString("CommandListSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to listsr. + /// + internal static string CommandListSuperRare { + get { + return ResourceManager.GetString("CommandListSuperRare", resourceCulture); + } + } + /// /// Looks up a localized string similar to Load settings. /// @@ -78,6 +159,24 @@ internal static string CommandLoadName { } } + /// + /// Looks up a localized string similar to Loaded {0}. + /// + internal static string CommandLoadSuccessFormat { + get { + return ResourceManager.GetString("CommandLoadSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to loadtl. + /// + internal static string CommandLoadTrackList { + get { + return ResourceManager.GetString("CommandLoadTrackList", resourceCulture); + } + } + /// /// Looks up a localized string similar to Save settings. /// @@ -87,6 +186,17 @@ internal static string CommandSaveDescription { } } + /// + /// Looks up a localized string similar to ; Be careful when updating this file :) + ///; For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html + ///; Colors are stored as an array of 'RGBA' floats. + /// + internal static string CommandSaveHeader { + get { + return ResourceManager.GetString("CommandSaveHeader", resourceCulture); + } + } + /// /// Looks up a localized string similar to save. /// @@ -96,6 +206,159 @@ internal static string CommandSaveName { } } + /// + /// Looks up a localized string similar to Saved {0}. + /// + internal static string CommandSaveSuccessFormat { + get { + return ResourceManager.GetString("CommandSaveSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to savetl. + /// + internal static string CommandSaveTrackList { + get { + return ResourceManager.GetString("CommandSaveTrackList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to spawn. + /// + internal static string CommandSpawn { + get { + return ResourceManager.GetString("CommandSpawn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to status. + /// + internal static string CommandStatus { + get { + return ResourceManager.GetString("CommandStatus", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is {1} {2}. + /// + internal static string CommandStatusTextFormat { + get { + return ResourceManager.GetString("CommandStatusTextFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ({0} to toggle). + /// + internal static string CommandStatusTextToggleFormat { + get { + return ResourceManager.GetString("CommandStatusTextToggleFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to template. + /// + internal static string CommandTemplate { + get { + return ResourceManager.GetString("CommandTemplate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: {1} [{2}]". + /// + internal static string CommandTemplateEnumerateFormat { + get { + return ResourceManager.GetString("CommandTemplateEnumerateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found {0} template(s). + /// + internal static string CommandTemplateSuccessFormat { + get { + return ResourceManager.GetString("CommandTemplateSuccessFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to track. + /// + internal static string CommandTrack { + get { + return ResourceManager.GetString("CommandTrack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to tracklist. + /// + internal static string CommandTrackList { + get { + return ResourceManager.GetString("CommandTrackList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tracking: {0}{1}. + /// + internal static string CommandTrackListEnumerateFormat { + get { + return ResourceManager.GetString("CommandTrackListEnumerateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tracking list updated.... + /// + internal static string CommandTrackListUpdated { + get { + return ResourceManager.GetString("CommandTrackListUpdated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tracking: {0} (Wishlist). + /// + internal static string CommandTrackListWishListEnumerateFormat { + get { + return ResourceManager.GetString("CommandTrackListWishListEnumerateFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to trackr. + /// + internal static string CommandTrackRare { + get { + return ResourceManager.GetString("CommandTrackRare", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to tracksr. + /// + internal static string CommandTrackSuperRare { + get { + return ResourceManager.GetString("CommandTrackSuperRare", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to untrack. + /// + internal static string CommandUnTrack { + get { + return ResourceManager.GetString("CommandUnTrack", resourceCulture); + } + } + /// /// Looks up a localized string similar to Patched {0} with {1}. /// @@ -105,6 +368,33 @@ internal static string DebugPatchedMethodFormat { } } + /// + /// Looks up a localized string similar to Refreshed {0} in {1}ms. + /// + internal static string DebugPerformanceRefreshedFormat { + get { + return ResourceManager.GetString("DebugPerformanceRefreshedFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Registering {0} command .... + /// + internal static string DebugRegisteringCommandFormat { + get { + return ResourceManager.GetString("DebugRegisteringCommandFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Registering {0} command with arguments.... + /// + internal static string DebugRegisteringCommandWithArgumentsFormat { + get { + return ResourceManager.GetString("DebugRegisteringCommandWithArgumentsFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to E. /// @@ -204,6 +494,96 @@ internal static string ErrorCannotFindPrefixMethodFormat { } } + /// + /// Looks up a localized string similar to {0} seems corrupted. Please fix. + /// + internal static string ErrorCorruptedFileFormat { + get { + return ResourceManager.GetString("ErrorCorruptedFileFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} seems corrupted in {1}. Please fix. + /// + internal static string ErrorCorruptedPropertyFormat { + get { + return ResourceManager.GetString("ErrorCorruptedPropertyFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to create item!. + /// + internal static string ErrorFailedToCreateItem { + get { + return ResourceManager.GetString("ErrorFailedToCreateItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to load item bundle!. + /// + internal static string ErrorFailedToLoadItemBundle { + get { + return ResourceManager.GetString("ErrorFailedToLoadItemBundle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} not found!. + /// + internal static string ErrorFileNotFoundFormat { + get { + return ResourceManager.GetString("ErrorFileNotFoundFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid arguments. + /// + internal static string ErrorInvalidArguments { + get { + return ResourceManager.GetString("ErrorInvalidArguments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No template found!. + /// + internal static string ErrorNoTemplateFound { + get { + return ResourceManager.GetString("ErrorNoTemplateFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Found {0} templates, be more specific. + /// + internal static string ErrorTooManyTemplatesFormat { + get { + return ResourceManager.GetString("ErrorTooManyTemplatesFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to load {0}. {1}. + /// + internal static string ErrorUnableToLoadFormat { + get { + return ResourceManager.GetString("ErrorUnableToLoadFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to save {0}. {1}. + /// + internal static string ErrorUnableToSaveFormat { + get { + return ResourceManager.GetString("ErrorUnableToSaveFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to Unsupported type: {0}. /// @@ -303,6 +683,15 @@ internal static string FeatureCommandsName { } } + /// + /// Looks up a localized string similar to EFT Trainer. + /// + internal static string FeatureCommandsTitle { + get { + return ResourceManager.GetString("FeatureCommandsTitle", resourceCulture); + } + } + /// /// Looks up a localized string similar to Crosshair with customizable size, color, thickness and auto-hide feature when aiming.. /// @@ -1150,7 +1539,7 @@ internal static string PropertyForward { } /// - /// Looks up a localized string similar to Fov. + /// Looks up a localized string similar to FOV. /// internal static string PropertyFov { get { @@ -1159,7 +1548,7 @@ internal static string PropertyFov { } /// - /// Looks up a localized string similar to Fov circle color. + /// Looks up a localized string similar to FOV circle color. /// internal static string PropertyFovCircleColor { get { @@ -1168,7 +1557,7 @@ internal static string PropertyFovCircleColor { } /// - /// Looks up a localized string similar to Fov circle thickness. + /// Looks up a localized string similar to FOV circle thickness. /// internal static string PropertyFovCircleThickness { get { @@ -1177,7 +1566,7 @@ internal static string PropertyFovCircleThickness { } /// - /// Looks up a localized string similar to Fov radius. + /// Looks up a localized string similar to FOV radius. /// internal static string PropertyFovRadius { get { @@ -1814,5 +2203,32 @@ internal static string PropertyY { return ResourceManager.GetString("PropertyY", resourceCulture); } } + + /// + /// Looks up a localized string similar to off. + /// + internal static string TextOff { + get { + return ResourceManager.GetString("TextOff", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to on. + /// + internal static string TextOn { + get { + return ResourceManager.GetString("TextOn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ------. + /// + internal static string TextSeparator { + get { + return ResourceManager.GetString("TextSeparator", resourceCulture); + } + } } } diff --git a/Properties/Strings.resx b/Properties/Strings.resx index 999c384d..72ba66c3 100644 --- a/Properties/Strings.resx +++ b/Properties/Strings.resx @@ -468,16 +468,16 @@ Forward - Fov + FOV - Fov circle color + FOV circle color - Fov circle thickness + FOV circle thickness - Fov radius + FOV radius Free look sensitivity @@ -707,4 +707,164 @@ Camera offset + + dump + + + list + + + listr + + + listsr + + + loadtl + + + savetl + + + spawn + + + status + + + template + + + track + + + tracklist + + + trackr + + + tracksr + + + untrack + + + Loaded {0} + Filename + + + ; Be careful when updating this file :) +; For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html +; Colors are stored as an array of 'RGBA' floats + + + Saved {0} + Filename + + + {0} seems corrupted. Please fix + Filename + + + {0} seems corrupted in {1}. Please fix + Key, filename + + + {0} not found! + Filename + + + Unable to load {0}. {1} + Filename, error message + + + Unable to save {0}. {1} + Filename, error message + + + {0} [{1}]{2} + Item name, count, optional rarity + + + Found {0} item(s) + Item count + + + Registering {0} command ... + Command name + + + Registering {0} command with arguments... + Command name + + + Invalid arguments + + + ------ + + + Dumping game objects... + + + Dumping Scenes... + + + Dump created in {0} + Filename + + + off + + + on + + + No template found! + + + Failed to load item bundle! + + + Failed to create item! + + + {0} is {1} {2} + Feature name, status, optional toggle text if a key is set + + + ({0} to toggle) + Key + + + {0}: {1} [{2}]" + Template id, short-name, name + + + Found {0} template(s) + Template count + + + Tracking: {0}{1} + Item short-name, optional rarity + + + Tracking list updated... + + + Tracking: {0} (Wishlist) + Item short-name + + + Found {0} templates, be more specific + Template count > 1 + + + Refreshed {0} in {1}ms + Type name, elapsed milliseconds + + + EFT Trainer + \ No newline at end of file From 9003cefd271ca185791f98f8c6d53e70104184dc Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Tue, 9 Jul 2024 21:15:55 +0200 Subject: [PATCH 03/21] Update installer --- Features/FeatureRenderer.cs | 2 +- Installer/CompilationResult.cs | 13 ++++++ Installer/Compiler.cs | 44 +++++++++++++++++++ Installer/InstallCommand.cs | 79 +++++++++++++++++++++++----------- Installer/Installer.csproj | 2 + Properties/Strings.Designer.cs | 2 +- Properties/Strings.resx | 2 +- 7 files changed, 117 insertions(+), 27 deletions(-) create mode 100644 Installer/CompilationResult.cs diff --git a/Features/FeatureRenderer.cs b/Features/FeatureRenderer.cs index 3964e0ce..533a1317 100644 --- a/Features/FeatureRenderer.cs +++ b/Features/FeatureRenderer.cs @@ -157,7 +157,7 @@ private static string RenderFeatureText(Feature feature) if (feature is not ToggleFeature toggleFeature || ConfigurationManager.IsSkippedProperty(feature, nameof(Enabled))) return feature.Name; - return string.Format(Strings.CommandStatusTextFormat, toggleFeature.Enabled ? Strings.TextOn.Green() : Strings.TextOff.Red()); + return string.Format(Strings.CommandStatusTextFormat, feature.Name, toggleFeature.Enabled ? Strings.TextOn.Green() : Strings.TextOff.Red(), string.Empty); } private void RenderSummary() diff --git a/Installer/CompilationResult.cs b/Installer/CompilationResult.cs new file mode 100644 index 00000000..d197c547 --- /dev/null +++ b/Installer/CompilationResult.cs @@ -0,0 +1,13 @@ +using System.IO.Compression; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; + +namespace Installer; + +internal class CompilationResult(CSharpCompilation? compilation, ZipArchive? archive, Diagnostic[] errors, ResourceDescription[] resources) +{ + public CSharpCompilation? Compilation { get; } = compilation; + public ZipArchive? Archive { get; } = archive; + public Diagnostic[] Errors { get; } = errors; + public ResourceDescription[] Resources { get; } = resources; +} diff --git a/Installer/Compiler.cs b/Installer/Compiler.cs index 517b4b6b..a31e76d5 100644 --- a/Installer/Compiler.cs +++ b/Installer/Compiler.cs @@ -1,9 +1,12 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; using System.IO.Compression; using System.Linq; +using System.Resources; +using System.Resources.NetStandard; using System.Text; using System.Text.RegularExpressions; using Installer.Properties; @@ -156,6 +159,44 @@ private IEnumerable GetSyntaxTrees() } } + public IEnumerable GetResources() + { + var matches = ResourceFileRegex().Matches(ProjectContent); + + foreach (var match in matches.Cast()) + { + if (!match.Success) + continue; + + var file = match.Groups["file"].Value; + var entry = ProjectArchive.Entries.FirstOrDefault(e => e.FullName.EndsWith(file.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar), StringComparison.OrdinalIgnoreCase)); + if (entry == null) + continue; + + using var stream = entry.Open(); + using var reader = new ResXResourceReader(stream); + + using var memory = new MemoryStream(); + using var writer = new ResourceWriter(memory); + + foreach (DictionaryEntry resourcEntry in reader) + writer.AddResource(resourcEntry.Key.ToString()!, resourcEntry.Value); + + var resource = new MemoryStream(); + + writer.Generate(); + memory.Position = 0; + memory.CopyTo(resource); + resource.Position = 0; + + var resourceName = file + .Replace(@"Properties\Strings", "EFT.Trainer.Properties.Strings") + .Replace(".resx", ".resources"); + + yield return new ResourceDescription(resourceName, () => resource, isPublic: true); + } + } + public CSharpCompilation Compile(string assemblyName) { var syntaxTrees = GetSyntaxTrees() @@ -172,4 +213,7 @@ public CSharpCompilation Compile(string assemblyName) [GeneratedRegex("<(Project)?Reference\\s+Include=\"(?.*)\"\\s*/?>")] private static partial Regex ProjectReferenceRegex(); + + [GeneratedRegex(".*)\"\\s*/?>")] + private static partial Regex ResourceFileRegex(); } diff --git a/Installer/InstallCommand.cs b/Installer/InstallCommand.cs index 5f64a336..cdfc8fee 100644 --- a/Installer/InstallCommand.cs +++ b/Installer/InstallCommand.cs @@ -13,6 +13,7 @@ using Installer.Properties; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Emit; using Spectre.Console; using Spectre.Console.Cli; @@ -67,9 +68,9 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett settings.DisabledFeatures = ToSourceFile(settings.DisabledFeatures, features); settings.DisabledCommands = ToSourceFile(settings.DisabledCommands, commands); - var (compilation, archive) = await BuildTrainerAsync(settings, installation, features, commands); + var result = await BuildTrainerAsync(settings, installation, features, commands); - if (compilation == null) + if (result.Compilation == null) { // Failure AnsiConsole.MarkupLine($"[red]Unable to compile trainer for version {installation.Version}. Please file an issue here : https://github.com/sailro/EscapeFromTarkov-Trainer/issues [/]"); @@ -86,35 +87,35 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett return (int)ExitCode.Canceled; } - if (!CreateDll(installation, "NLog.EFT.Trainer.dll", dllPath => compilation.Emit(dllPath))) + if (!CreateDll(installation, "NLog.EFT.Trainer.dll", dllPath => result.Compilation.Emit(dllPath, manifestResources: result.Resources))) return (int)ExitCode.CreateDllFailed; if (!CreateDll(installation, "0Harmony.dll", dllPath => File.WriteAllBytes(dllPath, Resources._0Harmony), false)) return (int)ExitCode.CreateHarmonyDllFailed; - if (!CreateOutline(installation, archive!)) + if (!CreateOutline(installation, result.Archive!)) return (int)ExitCode.CreateOutlineFailed; const string bepInExPluginProject = "BepInExPlugin.csproj"; - if (installation.UsingBepInEx && archive!.Entries.Any(e => e.Name == bepInExPluginProject)) + if (installation.UsingBepInEx && result.Archive!.Entries.Any(e => e.Name == bepInExPluginProject)) { AnsiConsole.MarkupLine("[green][[BepInEx]][/] detected. Creating plugin instead of using NLog configuration."); // reuse successful context for compiling. var pluginContext = new CompilationContext(installation, "plugin", bepInExPluginProject) { - Archive = archive, + Archive = result.Archive, Branch = GetInitialBranch(settings) }; - var (pluginCompilation, _, _) = await GetCompilationAsync(pluginContext); + var pluginResult = await GetCompilationAsync(pluginContext); - if (pluginCompilation == null) + if (pluginResult.Compilation == null) { AnsiConsole.MarkupLine($"[red]Unable to compile plugin for version {installation.Version}. Please file an issue here : https://github.com/sailro/EscapeFromTarkov-Trainer/issues [/]"); return (int)ExitCode.PluginCompilationFailed; } - if (!CreateDll(installation, Path.Combine(installation.BepInExPlugins, "aki-efttrainer.dll"), dllPath => pluginCompilation.Emit(dllPath))) + if (!CreateDll(installation, Path.Combine(installation.BepInExPlugins, "aki-efttrainer.dll"), dllPath => pluginResult.Compilation.Emit(dllPath))) return (int)ExitCode.CreatePluginDllFailed; } else @@ -140,7 +141,7 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett return (int)ExitCode.Success; } - private static async Task<(CSharpCompilation?, ZipArchive?)> BuildTrainerAsync(Settings settings, Installation installation, params string[] folders) + private static async Task BuildTrainerAsync(Settings settings, Installation installation, params string[] folders) { // Try first to compile against master var context = new CompilationContext(installation, "trainer", "NLog.EFT.Trainer.csproj") @@ -149,28 +150,28 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett Branch = GetInitialBranch(settings) }; - var (compilation, archive, errors) = await GetCompilationAsync(context); - var files = errors + var result = await GetCompilationAsync(context); + var files = result.Errors .Select(d => d.Location.SourceTree?.FilePath) .Where(s => s is not null) .Distinct() .ToArray(); if (context.IsFatalFailure) - return (compilation, archive); + return result; - if (compilation == null) + if (result.Compilation == null) { // Failure, so try with a dedicated branch if exists var retryBranch = GetRetryBranch(installation, context); if (retryBranch != null) { context.Branch = retryBranch; - (compilation, archive, _) = await GetCompilationAsync(context); + result = await GetCompilationAsync(context); } } - if (compilation == null && files.Length != 0 && files.All(file => folders.Any(folder => file!.StartsWith(folder)))) + if (result.Compilation == null && files.Length != 0 && files.All(file => folders.Any(folder => file!.StartsWith(folder)))) { // Failure, retry by removing faulting features if possible AnsiConsole.MarkupLine($"[yellow]Trying to disable faulting feature/command: [red]{GetFaultingNames(files!)}[/].[/]"); @@ -178,13 +179,13 @@ public override async Task ExecuteAsync(CommandContext commandContext, Sett context.Exclude = [.. files!, .. settings.DisabledFeatures!, .. settings.DisabledCommands!]; context.Branch = GetFallbackBranch(settings); - (compilation, archive, errors) = await GetCompilationAsync(context); + result = await GetCompilationAsync(context); - if (errors.Length == 0) + if (result.Errors.Length == 0) AnsiConsole.MarkupLine("[yellow]We found a fallback! But please file an issue here : https://github.com/sailro/EscapeFromTarkov-Trainer/issues [/]"); } - return (compilation, archive); + return result; } private static string GetFaultingNames(string[] files) @@ -234,18 +235,20 @@ private static void TryCreateGameDocumentFolder() } } - private static async Task<(CSharpCompilation?, ZipArchive?, Diagnostic[])> GetCompilationAsync(CompilationContext context) + private static async Task GetCompilationAsync(CompilationContext context) { var errors = Array.Empty(); + ResourceDescription[] resources = []; var archive = context.Archive ?? await GetSnapshotAsync(context, context.Branch); if (archive == null) { context.Try++; - return (null, null, errors); + return new(null, null, errors, resources); } CSharpCompilation? compilation = null; + AnsiConsole .Status() .Start($"Compiling {context.ProjectTitle}", _ => @@ -269,12 +272,16 @@ private static void TryCreateGameDocumentFolder() } else { + resources = compiler + .GetResources() + .ToArray(); + AnsiConsole.MarkupLine($">> [blue]Try #{context.Try}[/] Compilation [green]succeed[/] for [blue]{context.Branch.EscapeMarkup()}[/] branch."); } }); context.Try++; - return (compilation, archive, errors); + return new(compilation, archive, errors, resources); } private static async Task GetSnapshotAsync(CompilationContext context, string branch) @@ -418,6 +425,15 @@ private static bool CreateOutline(Installation installation, ZipArchive archive) } private static bool CreateDll(Installation installation, string filename, Action creator, bool overwrite = true) + { + return CreateDll(installation, filename, s => + { + creator(s); + return null; + }, overwrite); + } + + private static bool CreateDll(Installation installation, string filename, Func creator, bool overwrite = true) { var dllPath = Path.IsPathRooted(filename) ? filename : Path.Combine(installation.Managed, filename); var dllPathBepInExCore = Path.IsPathRooted(filename) ? null : Path.Combine(installation.BepInExCore, filename); @@ -431,9 +447,24 @@ private static bool CreateDll(Installation installation, string filename, Action if (!overwrite && File.Exists(dllPath)) return true; - creator(dllPath); - AnsiConsole.MarkupLine($"Created [green]{Path.GetFileName(dllPath).EscapeMarkup()}[/] in [blue]{Path.GetDirectoryName(dllPath).EscapeMarkup()}[/]."); + var result = creator(dllPath); + if (result != null) + { + var errors = result + .Diagnostics + .Where(d => d.Severity == DiagnosticSeverity.Error) + .ToArray(); +#if DEBUG + foreach (var error in errors) + AnsiConsole.MarkupLine($"[grey]>> {error.Id} [[{error.Location.SourceTree?.FilePath.EscapeMarkup()}]]: {error.GetMessage().EscapeMarkup()}.[/]"); +#endif + + if (!result.Success) + throw new Exception(errors.FirstOrDefault()?.GetMessage() ?? "Unknown error while emitting assembly"); + } + + AnsiConsole.MarkupLine($"Created [green]{Path.GetFileName(dllPath).EscapeMarkup()}[/] in [blue]{Path.GetDirectoryName(dllPath).EscapeMarkup()}[/]."); return true; } catch (Exception ex) diff --git a/Installer/Installer.csproj b/Installer/Installer.csproj index a45e4edc..51320b72 100644 --- a/Installer/Installer.csproj +++ b/Installer/Installer.csproj @@ -27,6 +27,7 @@ + @@ -34,6 +35,7 @@ + diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs index 3b1efa39..7faa7a6f 100644 --- a/Properties/Strings.Designer.cs +++ b/Properties/Strings.Designer.cs @@ -378,7 +378,7 @@ internal static string DebugPerformanceRefreshedFormat { } /// - /// Looks up a localized string similar to Registering {0} command .... + /// Looks up a localized string similar to Registering {0} command.... /// internal static string DebugRegisteringCommandFormat { get { diff --git a/Properties/Strings.resx b/Properties/Strings.resx index 72ba66c3..0b8a62e8 100644 --- a/Properties/Strings.resx +++ b/Properties/Strings.resx @@ -791,7 +791,7 @@ Item count - Registering {0} command ... + Registering {0} command... Command name From f4239d27add3a8c872e36ee2cce8e71fba421e4c Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Wed, 10 Jul 2024 11:33:38 +0200 Subject: [PATCH 04/21] Add another language --- NLog.EFT.Trainer.csproj | 1 + Properties/Strings.fr.resx | 825 +++++++++++++++++++++++++++++++++++++ 2 files changed, 826 insertions(+) create mode 100644 Properties/Strings.fr.resx diff --git a/NLog.EFT.Trainer.csproj b/NLog.EFT.Trainer.csproj index 85973aac..7ea4e6fc 100644 --- a/NLog.EFT.Trainer.csproj +++ b/NLog.EFT.Trainer.csproj @@ -228,6 +228,7 @@ + ResXFileCodeGenerator Strings.Designer.cs diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx new file mode 100644 index 00000000..17de7844 --- /dev/null +++ b/Properties/Strings.fr.resx @@ -0,0 +1,825 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + dump + + + aimbot + + + Smoothness + + + Status filter + + + Teleport + + + Thickness + + + Vitals only + + + X + + + Y + + + Bear colors + + + Border color + + + Boss colors + + + Box thickness + + + Cultist colors + + + Size + + + Info color + + + Marksman colors + + + Not shootable colors + + + Radar background + + + Radar crosshair + + + Radar percentage + + + Radar range + + + Range + + + Rogue-Usec colors + + + Scav-assault colors + + + Scav colors + + + Scav-raider colors + + + Search inside containers + + + Intensity + + + Search inside corpses + + + Silent aim speed-factor + + + Silent aim + + + Hide when aiming + + + Hit-marker color + + + Key + + + Left + + + Maximum distance + + + Movement speed + + + Not eligible color + + + Rate + + + Remove negative effects + + + Right + + + Show armor damage + + + Show bosses + + + Silent aim next-shot-delay + + + Show compass + + + Show cultists + + + Show eligible + + + Show fov circle + + + Show health-damage + + + Show Hit-marker + + + Show marksmen + + + Show not eligible + + + Show players + + + Show rogues + + + Show Scav-assaults + + + Show Scav-raiders + + + Show Scavs + + + Show coordinates + + + Health-damage color + + + Shootable colors + + + Show charms + + + {0} seems corrupted in {1}. Please fix + + + {0} not found! + + + Unable to load {0}. {1} + + + Unable to save {0}. {1} + + + {0} [{1}]{2} + + + Found {0} item(s) + + + Registering {0} command... + + + Registering {0} command with arguments... + + + Invalid arguments + + + ------ + + + Dumping game objects... + + + Dumping Scenes... + + + {0} seems corrupted. Please fix + + + Dump created in {0} + + + on + + + No template found! + + + Failed to load item bundle! + + + Failed to create item! + + + {0} is {1} {2} + + + ({0} to toggle) + + + {0}: {1} [{2}]" + + + Found {0} template(s) + + + Tracking: {0}{1} + + + Tracking list updated... + + + Tracking: {0} (Wishlist) + + + Found {0} templates, be more specific + + + off + + + Show boxes + + + Saved {0} + + + Loaded {0} + + + Show containers + + + Show corpses + + + Show infos + + + Show map + + + Show not shootable + + + Show prices + + + Show shootable + + + Show skeletons + + + Skeleton thickness + + + Track Wishlist + + + Usec colors + + + XRay-Vision + + + ; Be careful when updating this file :) +; For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html +; Colors are stored as an array of 'RGBA' floats + + + Camera offset + + + listr + + + listsr + + + loadtl + + + savetl + + + spawn + + + status + + + template + + + track + + + tracklist + + + trackr + + + tracksr + + + untrack + + + list + + + Refreshed {0} in {1}ms + + + Grouping Color + + + FOV radius + + + Open + + + Requirement + + + Cannot find original method {0} + + + Cannot find prefix method {0} + + + Cannot find postfix method {0} + + + [summary] + + + Welcome to EFT Trainer ! + + + Load settings + + + Save settings + + + Unsupported type: {0} + + + fovchanger + + + Change Field Of View (FOV). + + + Pending + + + camera + + + gamestate + + + Refresh all game information for other features. + + + ghost + + + Stop bots from seeing you. + + + grenade + + + Grenades outline. + + + health + + + Full health, prevent any damage (so even when falling), keep energy and hydration at maximum. + + + hits + + + Hit markers (hit, armor, health with configurable colors). + + + hud + + + HUD (compass, ammo left in chamber / magazine, fire mode, coordinates). + + + Free camera with fast mode and teleportation. + + + interact + + + Closed + + + Activate + + + Aimbot. Automatic aiming and/or shooting (SilentAim). + + + ammo + + + Unlimited ammo. + + + autogun + + + Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate. + + + N + + + NE + + + E + + + SE + + + Patched {0} with {1} + + + S + + + SW + + + Timer + + + W + + + commands + + + This main popup window. + + + load + + + save + + + crosshair + + + Crosshair with customizable size, color, thickness and auto-hide feature when aiming. + + + durability + + + Maximum durability of items. + + + examine + + + All items already examined. Instant search. + + + exfil + + + Exfiltration points with customizable colors given eligibility, status filter, distance. + + + NW + + + Free look sensitivity + + + Change distance for loot/door interaction. + + + Hidden/special stashes like buried barrels, ground caches, air drops or corpses. + + + thermal + + + Thermal vision. + + + train + + + Summon train on compatible maps like Reserve or Lighthouse. + + + wallshoot + + + Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet. + + + weather + + + Clear weather. + + + opener + + + Door/Keycard reader/Car unlocker. + + + Armor-damage color + + + Backward + + + Cache time (sec) + + + Change time + + + Color + + + Display time + + + Distance + + + Eligible color + + + Actif + + + Fade-out time + + + Fast mode + + + Fast movement speed + + + Food / water + + + Forward + + + FOV + + + FOV circle color + + + FOV circle thickness + + + Unlimited stamina. + + + stash + + + stamina + + + speed + + + loot + + + List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display. + + + map + + + Full screen map with radar esp. + + + night + + + Night vision. + + + nocoll + + + No physical collisions, making you immune to bullets, grenades and barbed wires. + + + nomal + + + No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating. + + + norecoil + + + No recoil. + + + nosway + + + No sway. + + + novisor + + + No visor, so even when using a face shield-visor you won't see it. + + + wallhack + + + Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance. + + + quest + + + Locations for taking/placing quest items. Only items related to your started quests are displayed. + + + quickthrow + + + Quick-throw grenades. + + + radar + + + 2D radar. + + + skills + + + All skills to Elite level (51) and all weapons mastering to level 3. + + + Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself. + + + EFT Trainer + + \ No newline at end of file From e62c6e5e10e8339f5f1e3d2d792e5b765a4db1c4 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Wed, 10 Jul 2024 16:07:47 +0200 Subject: [PATCH 05/21] Revert test --- NLog.EFT.Trainer.csproj | 1 - Properties/Strings.fr.resx | 825 ------------------------------------- 2 files changed, 826 deletions(-) delete mode 100644 Properties/Strings.fr.resx diff --git a/NLog.EFT.Trainer.csproj b/NLog.EFT.Trainer.csproj index 7ea4e6fc..85973aac 100644 --- a/NLog.EFT.Trainer.csproj +++ b/NLog.EFT.Trainer.csproj @@ -228,7 +228,6 @@ - ResXFileCodeGenerator Strings.Designer.cs diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx deleted file mode 100644 index 17de7844..00000000 --- a/Properties/Strings.fr.resx +++ /dev/null @@ -1,825 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - dump - - - aimbot - - - Smoothness - - - Status filter - - - Teleport - - - Thickness - - - Vitals only - - - X - - - Y - - - Bear colors - - - Border color - - - Boss colors - - - Box thickness - - - Cultist colors - - - Size - - - Info color - - - Marksman colors - - - Not shootable colors - - - Radar background - - - Radar crosshair - - - Radar percentage - - - Radar range - - - Range - - - Rogue-Usec colors - - - Scav-assault colors - - - Scav colors - - - Scav-raider colors - - - Search inside containers - - - Intensity - - - Search inside corpses - - - Silent aim speed-factor - - - Silent aim - - - Hide when aiming - - - Hit-marker color - - - Key - - - Left - - - Maximum distance - - - Movement speed - - - Not eligible color - - - Rate - - - Remove negative effects - - - Right - - - Show armor damage - - - Show bosses - - - Silent aim next-shot-delay - - - Show compass - - - Show cultists - - - Show eligible - - - Show fov circle - - - Show health-damage - - - Show Hit-marker - - - Show marksmen - - - Show not eligible - - - Show players - - - Show rogues - - - Show Scav-assaults - - - Show Scav-raiders - - - Show Scavs - - - Show coordinates - - - Health-damage color - - - Shootable colors - - - Show charms - - - {0} seems corrupted in {1}. Please fix - - - {0} not found! - - - Unable to load {0}. {1} - - - Unable to save {0}. {1} - - - {0} [{1}]{2} - - - Found {0} item(s) - - - Registering {0} command... - - - Registering {0} command with arguments... - - - Invalid arguments - - - ------ - - - Dumping game objects... - - - Dumping Scenes... - - - {0} seems corrupted. Please fix - - - Dump created in {0} - - - on - - - No template found! - - - Failed to load item bundle! - - - Failed to create item! - - - {0} is {1} {2} - - - ({0} to toggle) - - - {0}: {1} [{2}]" - - - Found {0} template(s) - - - Tracking: {0}{1} - - - Tracking list updated... - - - Tracking: {0} (Wishlist) - - - Found {0} templates, be more specific - - - off - - - Show boxes - - - Saved {0} - - - Loaded {0} - - - Show containers - - - Show corpses - - - Show infos - - - Show map - - - Show not shootable - - - Show prices - - - Show shootable - - - Show skeletons - - - Skeleton thickness - - - Track Wishlist - - - Usec colors - - - XRay-Vision - - - ; Be careful when updating this file :) -; For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html -; Colors are stored as an array of 'RGBA' floats - - - Camera offset - - - listr - - - listsr - - - loadtl - - - savetl - - - spawn - - - status - - - template - - - track - - - tracklist - - - trackr - - - tracksr - - - untrack - - - list - - - Refreshed {0} in {1}ms - - - Grouping Color - - - FOV radius - - - Open - - - Requirement - - - Cannot find original method {0} - - - Cannot find prefix method {0} - - - Cannot find postfix method {0} - - - [summary] - - - Welcome to EFT Trainer ! - - - Load settings - - - Save settings - - - Unsupported type: {0} - - - fovchanger - - - Change Field Of View (FOV). - - - Pending - - - camera - - - gamestate - - - Refresh all game information for other features. - - - ghost - - - Stop bots from seeing you. - - - grenade - - - Grenades outline. - - - health - - - Full health, prevent any damage (so even when falling), keep energy and hydration at maximum. - - - hits - - - Hit markers (hit, armor, health with configurable colors). - - - hud - - - HUD (compass, ammo left in chamber / magazine, fire mode, coordinates). - - - Free camera with fast mode and teleportation. - - - interact - - - Closed - - - Activate - - - Aimbot. Automatic aiming and/or shooting (SilentAim). - - - ammo - - - Unlimited ammo. - - - autogun - - - Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate. - - - N - - - NE - - - E - - - SE - - - Patched {0} with {1} - - - S - - - SW - - - Timer - - - W - - - commands - - - This main popup window. - - - load - - - save - - - crosshair - - - Crosshair with customizable size, color, thickness and auto-hide feature when aiming. - - - durability - - - Maximum durability of items. - - - examine - - - All items already examined. Instant search. - - - exfil - - - Exfiltration points with customizable colors given eligibility, status filter, distance. - - - NW - - - Free look sensitivity - - - Change distance for loot/door interaction. - - - Hidden/special stashes like buried barrels, ground caches, air drops or corpses. - - - thermal - - - Thermal vision. - - - train - - - Summon train on compatible maps like Reserve or Lighthouse. - - - wallshoot - - - Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet. - - - weather - - - Clear weather. - - - opener - - - Door/Keycard reader/Car unlocker. - - - Armor-damage color - - - Backward - - - Cache time (sec) - - - Change time - - - Color - - - Display time - - - Distance - - - Eligible color - - - Actif - - - Fade-out time - - - Fast mode - - - Fast movement speed - - - Food / water - - - Forward - - - FOV - - - FOV circle color - - - FOV circle thickness - - - Unlimited stamina. - - - stash - - - stamina - - - speed - - - loot - - - List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display. - - - map - - - Full screen map with radar esp. - - - night - - - Night vision. - - - nocoll - - - No physical collisions, making you immune to bullets, grenades and barbed wires. - - - nomal - - - No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating. - - - norecoil - - - No recoil. - - - nosway - - - No sway. - - - novisor - - - No visor, so even when using a face shield-visor you won't see it. - - - wallhack - - - Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance. - - - quest - - - Locations for taking/placing quest items. Only items related to your started quests are displayed. - - - quickthrow - - - Quick-throw grenades. - - - radar - - - 2D radar. - - - skills - - - All skills to Elite level (51) and all weapons mastering to level 3. - - - Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself. - - - EFT Trainer - - \ No newline at end of file From 582f153dfd62b6729d98eb495b61b361fee67580 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Wed, 10 Jul 2024 16:34:27 +0200 Subject: [PATCH 06/21] Fixes after testing --- ConsoleCommands/TrackList.cs | 2 +- Properties/Strings.Designer.cs | 2 +- Properties/Strings.resx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ConsoleCommands/TrackList.cs b/ConsoleCommands/TrackList.cs index 9adce36b..0f71f1af 100644 --- a/ConsoleCommands/TrackList.cs +++ b/ConsoleCommands/TrackList.cs @@ -28,7 +28,7 @@ internal static void ShowTrackList(ConsoleCommand command, Features.LootItems lo foreach (var item in lootItems.TrackedNames) { var extra = item.Rarity.HasValue ? $" ({item.Rarity.Value.Color()})" : string.Empty; - command.AddConsoleLog(string.Format(Strings.CommandTemplateEnumerateFormat, item.Color.HasValue ? item.Name.Color(item.Color.Value) : item.Name, extra)); + command.AddConsoleLog(string.Format(Strings.CommandTrackListEnumerateFormat, item.Color.HasValue ? item.Name.Color(item.Color.Value) : item.Name, extra)); } } } diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs index 7faa7a6f..581b00da 100644 --- a/Properties/Strings.Designer.cs +++ b/Properties/Strings.Designer.cs @@ -270,7 +270,7 @@ internal static string CommandTemplate { } /// - /// Looks up a localized string similar to {0}: {1} [{2}]". + /// Looks up a localized string similar to {0}: {1} [{2}]. /// internal static string CommandTemplateEnumerateFormat { get { diff --git a/Properties/Strings.resx b/Properties/Strings.resx index 0b8a62e8..99669bac 100644 --- a/Properties/Strings.resx +++ b/Properties/Strings.resx @@ -838,7 +838,7 @@ Key - {0}: {1} [{2}]" + {0}: {1} [{2}] Template id, short-name, name From 1cdb1b643c750c937c40c0eaf43cb7cd72460c79 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Wed, 10 Jul 2024 18:30:00 +0200 Subject: [PATCH 07/21] Extract remaining strings --- Configuration/ConfigurationManager.cs | 10 +- ConsoleCommands/BaseListCommand.cs | 2 +- ConsoleCommands/TrackList.cs | 2 +- Features/ExfiltrationPoints.cs | 2 +- Features/Hud.cs | 9 +- Features/Players.cs | 3 +- Features/PointOfInterests.cs | 27 +++-- Features/Quests.cs | 2 +- Model/ReflectionWrapper.cs | 3 +- Properties/Strings.Designer.cs | 157 ++++++++++++++++++++++---- Properties/Strings.resx | 59 +++++++++- 11 files changed, 222 insertions(+), 54 deletions(-) diff --git a/Configuration/ConfigurationManager.cs b/Configuration/ConfigurationManager.cs index b7da5a0e..c4afb5b1 100644 --- a/Configuration/ConfigurationManager.cs +++ b/Configuration/ConfigurationManager.cs @@ -29,7 +29,7 @@ public static void Load(string filename, Feature[] features, bool warnIfNotExist if (!File.Exists(filename)) { if (warnIfNotExists) - AddConsoleLog($"{filename} not found!"); + AddConsoleLog(string.Format(Strings.ErrorFileNotFoundFormat, filename)); return; } @@ -64,7 +64,7 @@ public static void Load(string filename, Feature[] features, bool warnIfNotExist } catch (Exception ioe) { - AddConsoleLog(string.Format(Strings.ErrorUnableToLoadFormat, filename, ioe.Message).Red()); + AddConsoleLog(string.Format(Strings.ErrorCannotLoadFormat, filename, ioe.Message).Red()); } } @@ -97,7 +97,7 @@ public static void LoadPropertyValue(string filename, Feature feature, string pr } catch (Exception ioe) { - AddConsoleLog(string.Format(Strings.ErrorUnableToLoadFormat, filename, ioe.Message).Red()); + AddConsoleLog(string.Format(Strings.ErrorCannotLoadFormat, filename, ioe.Message).Red()); } } @@ -135,7 +135,7 @@ public static void Save(string filename, Feature[] features) } catch (Exception ioe) { - AddConsoleLog(string.Format(Strings.ErrorUnableToSaveFormat, filename, ioe.Message).Red()); + AddConsoleLog(string.Format(Strings.ErrorCannotSaveFormat, filename, ioe.Message).Red()); } } @@ -153,7 +153,7 @@ public static void SavePropertyValue(string filename, Feature feature, string pr } catch (Exception ioe) { - AddConsoleLog(string.Format(Strings.ErrorUnableToSaveFormat, filename, ioe.Message).Red()); + AddConsoleLog(string.Format(Strings.ErrorCannotSaveFormat, filename, ioe.Message).Red()); } } diff --git a/ConsoleCommands/BaseListCommand.cs b/ConsoleCommands/BaseListCommand.cs index b419afba..4d373373 100644 --- a/ConsoleCommands/BaseListCommand.cs +++ b/ConsoleCommands/BaseListCommand.cs @@ -63,7 +63,7 @@ private void ListLootItems(Match match, ELootRarity? rarityFilter = null) if (rarityFilter.HasValue && rarityFilter.Value != rarity) continue; - var extra = rarity != ELootRarity.Not_exist ? $" ({rarity.Color()})" : string.Empty; + var extra = rarity != ELootRarity.Not_exist ? string.Format(Strings.CommandListRarityFormat, rarity.Color()) : string.Empty; AddConsoleLog(string.Format(Strings.CommandListEnumerateFormat, itemName, list.Count.ToString().Cyan(), extra)); count += list.Count; diff --git a/ConsoleCommands/TrackList.cs b/ConsoleCommands/TrackList.cs index 0f71f1af..d074a034 100644 --- a/ConsoleCommands/TrackList.cs +++ b/ConsoleCommands/TrackList.cs @@ -27,7 +27,7 @@ internal static void ShowTrackList(ConsoleCommand command, Features.LootItems lo foreach (var item in lootItems.TrackedNames) { - var extra = item.Rarity.HasValue ? $" ({item.Rarity.Value.Color()})" : string.Empty; + var extra = item.Rarity.HasValue ? string.Format(Strings.CommandTrackListRarityFormat, item.Rarity.Value.Color()) : string.Empty; command.AddConsoleLog(string.Format(Strings.CommandTrackListEnumerateFormat, item.Color.HasValue ? item.Name.Color(item.Color.Value) : item.Name, extra)); } } diff --git a/Features/ExfiltrationPoints.cs b/Features/ExfiltrationPoints.cs index ba9bdeb6..a8f0df90 100644 --- a/Features/ExfiltrationPoints.cs +++ b/Features/ExfiltrationPoints.cs @@ -98,7 +98,7 @@ public override void RefreshData(List data) private static string GetName(ExfiltrationPoint point, bool isEligible) { var localizedName = point.Settings.Name.Localized(); - return !isEligible ? localizedName : $"{localizedName} ({GetStatus(point.Status)})"; + return !isEligible ? localizedName : string.Format(Strings.FeatureExfiltrationPointsEligibleFormat, localizedName, GetStatus(point.Status)); } public static string GetStatus(EExfiltrationStatus status) diff --git a/Features/Hud.cs b/Features/Hud.cs index e45a76aa..cbf18b56 100644 --- a/Features/Hud.cs +++ b/Features/Hud.cs @@ -57,7 +57,6 @@ protected override void OnGUIWhenEnabled() return; _sb.Clear(); - const string separator = " - "; if (ShowCompass) { @@ -66,16 +65,16 @@ protected override void OnGUIWhenEnabled() var heading = Quaternion.LookRotation(forward).eulerAngles.y; _sb.Append(_directions[(int)Mathf.Round(heading % 360 / 45)]); - _sb.Append(separator); + _sb.Append(Strings.FeatureHudSeparator); } - _sb.Append($"{mag.Count}+{weapon.ChamberAmmoCount}/{mag.MaxCount} [{weapon.SelectedFireMode}]"); + _sb.Append(string.Format(Strings.FeatureHudWeaponFormat, mag.Count, weapon.ChamberAmmoCount, mag.MaxCount, weapon.SelectedFireMode)); if (ShowCoordinates) { - _sb.Append(separator); + _sb.Append(Strings.FeatureHudSeparator); var position = player.Transform.position; - _sb.Append($"({Mathf.RoundToInt(position.x)},{Mathf.RoundToInt(position.z)})"); + _sb.Append(string.Format(Strings.FeatureHudCoordinatesFormat, Mathf.RoundToInt(position.x), Mathf.RoundToInt(position.z))); } Render.DrawString(new Vector2(512, Screen.height - 16f), _sb.ToString(), Color); diff --git a/Features/Players.cs b/Features/Players.cs index 3fdc06e6..9f3f2583 100644 --- a/Features/Players.cs +++ b/Features/Players.cs @@ -233,7 +233,8 @@ protected void OnGUI() var maximumPlayerHealth = bodyPartHealth.Maximum; var weaponText = ennemyHandController != null && ennemyHandController.Item is Weapon weapon ? weapon.ShortName.Localized() : string.Empty; - var infoText = $"{weaponText} {Mathf.Round(currentPlayerHealth * 100 / maximumPlayerHealth)}% [{distance}m]".Trim(); + var distanceText = string.Format(Strings.FeaturePointOfInterestsDistanceFormat, distance); + var infoText = string.Format(Strings.FeaturePlayersFormat, weaponText, Mathf.Round(currentPlayerHealth * 100 / maximumPlayerHealth), distanceText).Trim(); Render.DrawString(new Vector2(boxPositionX, boxPositionY - 20f), infoText, playerColors.InfoColor, false); } diff --git a/Features/PointOfInterests.cs b/Features/PointOfInterests.cs index e4d5a5ba..5e7ee5cc 100644 --- a/Features/PointOfInterests.cs +++ b/Features/PointOfInterests.cs @@ -5,6 +5,7 @@ using System.Text; using EFT.Trainer.Configuration; using EFT.Trainer.Extensions; +using EFT.Trainer.Properties; using EFT.Trainer.UI; using UnityEngine; @@ -80,7 +81,8 @@ public override void ProcessDataOnGUI(IReadOnlyList data) if (owner != null && distinctGroup.Count > 1) { flags = GetCaptionFlags.Name; - drawPosition = new Vector2(drawPosition.x, drawPosition.y + Render.DrawString(drawPosition, $">> In {owner} [{distance}m]", GroupingColor, false).y); + var distanceText = string.Format(Strings.FeaturePointOfInterestsDistanceFormat, distance); + drawPosition = new Vector2(drawPosition.x, drawPosition.y + Render.DrawString(drawPosition, string.Format(Strings.FeaturePointOfInterestsGroupFormat, owner, distanceText), GroupingColor, false).y); } foreach (var poi in distinctGroup) @@ -102,25 +104,22 @@ public enum GetCaptionFlags public virtual string GetCaption(PointOfInterest poi, double distance, GetCaptionFlags flags = GetCaptionFlags.All) { - var result = new StringBuilder(); + var nameText = string.Empty; + var distanceText = string.Empty; + var ownerText = string.Empty; if ((flags & GetCaptionFlags.Name) != 0) - { - result.Append(poi.Name); - result.Append(" "); - } + nameText = poi.Name; if (poi.Owner != null && (flags & GetCaptionFlags.Owner) != 0) - { - result.Append($"(in {poi.Owner})"); - result.Append(" "); - } + ownerText = string.Format(Strings.FeaturePointOfInterestsOwnerFormat, poi.Owner); if ((flags & GetCaptionFlags.Distance) != 0) - { - result.Append($"[{distance}m]"); - } + distanceText = string.Format(Strings.FeaturePointOfInterestsDistanceFormat, distance); - return result.ToString(); + return string + .Format(Strings.FeaturePointOfInterestsFormat, nameText, ownerText, distanceText) + .Replace(" ", " ") + .Trim(); } } diff --git a/Features/Quests.cs b/Features/Quests.cs index a97c4f62..fac2fdf0 100644 --- a/Features/Quests.cs +++ b/Features/Quests.cs @@ -147,7 +147,7 @@ private void RefreshPlaceOrRepairItemLocations(QuestDataClass[] startedQuests, P private void AddQuestRecord(List records, Condition condition, QuestDataClass quest, Vector3 position) { var poi = Pool.Get(); - poi.Name = $"{condition.FormattedDescription} ({quest.Template!.Name})"; + poi.Name = string.Format(Strings.FeatureQuestsFormat, condition.FormattedDescription, quest.Template!.Name); poi.Position = position; poi.Color = Color; poi.Owner = null; diff --git a/Model/ReflectionWrapper.cs b/Model/ReflectionWrapper.cs index 1416ef54..b96e3fd1 100644 --- a/Model/ReflectionWrapper.cs +++ b/Model/ReflectionWrapper.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Reflection; +using EFT.Trainer.Properties; using EFT.UI; using HarmonyLib; @@ -22,7 +23,7 @@ internal class ReflectionWrapper { #if DEBUG if (warnOnFailure) - AddConsoleLog($"Unable to find {name} on {_instanceType.Name}"); + AddConsoleLog(string.Format(Strings.ErrorCannotFindField, name, _instanceType.Name)); #endif return default; } diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs index 581b00da..14a9ffef 100644 --- a/Properties/Strings.Designer.cs +++ b/Properties/Strings.Designer.cs @@ -106,7 +106,7 @@ internal static string CommandList { } /// - /// Looks up a localized string similar to {0} [{1}]{2}. + /// Looks up a localized string similar to {0} [{1}] {2}. /// internal static string CommandListEnumerateFormat { get { @@ -123,6 +123,15 @@ internal static string CommandListRare { } } + /// + /// Looks up a localized string similar to ({0}). + /// + internal static string CommandListRarityFormat { + get { + return ResourceManager.GetString("CommandListRarityFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to Found {0} item(s). /// @@ -306,7 +315,7 @@ internal static string CommandTrackList { } /// - /// Looks up a localized string similar to Tracking: {0}{1}. + /// Looks up a localized string similar to Tracking: {0} {1}. /// internal static string CommandTrackListEnumerateFormat { get { @@ -314,6 +323,15 @@ internal static string CommandTrackListEnumerateFormat { } } + /// + /// Looks up a localized string similar to ({0}). + /// + internal static string CommandTrackListRarityFormat { + get { + return ResourceManager.GetString("CommandTrackListRarityFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to Tracking list updated.... /// @@ -467,6 +485,15 @@ internal static string DirectionWest { } } + /// + /// Looks up a localized string similar to Unable to find {0} on {1}. + /// + internal static string ErrorCannotFindField { + get { + return ResourceManager.GetString("ErrorCannotFindField", resourceCulture); + } + } + /// /// Looks up a localized string similar to Cannot find original method {0}. /// @@ -494,6 +521,24 @@ internal static string ErrorCannotFindPrefixMethodFormat { } } + /// + /// Looks up a localized string similar to Unable to load {0}. {1}. + /// + internal static string ErrorCannotLoadFormat { + get { + return ResourceManager.GetString("ErrorCannotLoadFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to save {0}. {1}. + /// + internal static string ErrorCannotSaveFormat { + get { + return ResourceManager.GetString("ErrorCannotSaveFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to {0} seems corrupted. Please fix. /// @@ -566,24 +611,6 @@ internal static string ErrorTooManyTemplatesFormat { } } - /// - /// Looks up a localized string similar to Unable to load {0}. {1}. - /// - internal static string ErrorUnableToLoadFormat { - get { - return ResourceManager.GetString("ErrorUnableToLoadFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to save {0}. {1}. - /// - internal static string ErrorUnableToSaveFormat { - get { - return ResourceManager.GetString("ErrorUnableToSaveFormat", resourceCulture); - } - } - /// /// Looks up a localized string similar to Unsupported type: {0}. /// @@ -755,6 +782,15 @@ internal static string FeatureExfiltrationPointsDescription { } } + /// + /// Looks up a localized string similar to {0} ({1}). + /// + internal static string FeatureExfiltrationPointsEligibleFormat { + get { + return ResourceManager.GetString("FeatureExfiltrationPointsEligibleFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to exfil. /// @@ -935,6 +971,15 @@ internal static string FeatureHitsName { } } + /// + /// Looks up a localized string similar to ({0},{1}). + /// + internal static string FeatureHudCoordinatesFormat { + get { + return ResourceManager.GetString("FeatureHudCoordinatesFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to HUD (compass, ammo left in chamber / magazine, fire mode, coordinates).. /// @@ -953,6 +998,24 @@ internal static string FeatureHudName { } } + /// + /// Looks up a localized string similar to - . + /// + internal static string FeatureHudSeparator { + get { + return ResourceManager.GetString("FeatureHudSeparator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}+{1}/{2} [{3}]. + /// + internal static string FeatureHudWeaponFormat { + get { + return ResourceManager.GetString("FeatureHudWeaponFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to Change distance for loot/door interaction.. /// @@ -1124,6 +1187,15 @@ internal static string FeaturePlayersDescription { } } + /// + /// Looks up a localized string similar to {0} {1}% {2}. + /// + internal static string FeaturePlayersFormat { + get { + return ResourceManager.GetString("FeaturePlayersFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to wallhack. /// @@ -1133,6 +1205,42 @@ internal static string FeaturePlayersName { } } + /// + /// Looks up a localized string similar to [{0}m]. + /// + internal static string FeaturePointOfInterestsDistanceFormat { + get { + return ResourceManager.GetString("FeaturePointOfInterestsDistanceFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} {1} {2}. + /// + internal static string FeaturePointOfInterestsFormat { + get { + return ResourceManager.GetString("FeaturePointOfInterestsFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to >> In {0} {1}. + /// + internal static string FeaturePointOfInterestsGroupFormat { + get { + return ResourceManager.GetString("FeaturePointOfInterestsGroupFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (in {0}). + /// + internal static string FeaturePointOfInterestsOwnerFormat { + get { + return ResourceManager.GetString("FeaturePointOfInterestsOwnerFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to Locations for taking/placing quest items. Only items related to your started quests are displayed.. /// @@ -1142,6 +1250,15 @@ internal static string FeatureQuestsDescription { } } + /// + /// Looks up a localized string similar to {0} ({1}). + /// + internal static string FeatureQuestsFormat { + get { + return ResourceManager.GetString("FeatureQuestsFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to quest. /// diff --git a/Properties/Strings.resx b/Properties/Strings.resx index 99669bac..54dae2d1 100644 --- a/Properties/Strings.resx +++ b/Properties/Strings.resx @@ -774,16 +774,16 @@ {0} not found! Filename - + Unable to load {0}. {1} Filename, error message - + Unable to save {0}. {1} Filename, error message - {0} [{1}]{2} + {0} [{1}] {2} Item name, count, optional rarity @@ -846,7 +846,7 @@ Template count - Tracking: {0}{1} + Tracking: {0} {1} Item short-name, optional rarity @@ -867,4 +867,55 @@ EFT Trainer + + ({0}) + Rarity + + + ({0}) + Rarity + + + Unable to find {0} on {1} + Field name, type name + + + {0} ({1}) + Name, status + + + ({0},{1}) + X, y + + + - + + + {0}+{1}/{2} [{3}] + Magazine count, chamber count, magazine capacity, fire-mode + + + {0} {1}% {2} + Weapon name, health %, distance + + + [{0}m] + Distance + + + {0} {1} {2} + Name, optional formatted owner, optional formatted distance + + + >> In {0} {1} + Owner, distance + + + (in {0}) + Owner + + + {0} ({1}) + Condition description, quest name + \ No newline at end of file From 48d66c11a88e68ed3428585f3e3f64055915b12f Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Wed, 10 Jul 2024 20:59:31 +0200 Subject: [PATCH 08/21] Fix spt-aki detection --- Installer/Installation.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Installer/Installation.cs b/Installer/Installation.cs index 0dfe4e46..df58ae55 100644 --- a/Installer/Installation.cs +++ b/Installer/Installation.cs @@ -139,8 +139,9 @@ private static bool TryDiscoverInstallation(string? path, [NotNullWhen(true)] ou if (!Directory.Exists(installation.Managed)) return false; - var akiFolder = Path.Combine(path, "Aki_Data"); - installation.UsingSptAki = Directory.Exists(akiFolder); + var legacyAkiFolder = Path.Combine(path, "Aki_Data"); + var akiFolder = Path.Combine(path, "SPT_Data"); + installation.UsingSptAki = Directory.Exists(akiFolder) || Directory.Exists(legacyAkiFolder); installation.UsingBepInEx = Directory.Exists(installation.BepInExPlugins); From d963b7d4e0d4b723413896d8e1c79dd27b16b64f Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Wed, 10 Jul 2024 21:00:21 +0200 Subject: [PATCH 09/21] Extract property comments --- Configuration/ConfigurationManager.cs | 18 ++++++++++++++---- .../ConfigurationPropertyAttribute.cs | 2 +- Features/LootItems.cs | 2 +- Properties/Strings.Designer.cs | 15 ++++++++++++--- Properties/Strings.resx | 9 ++++++--- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Configuration/ConfigurationManager.cs b/Configuration/ConfigurationManager.cs index c4afb5b1..2c517863 100644 --- a/Configuration/ConfigurationManager.cs +++ b/Configuration/ConfigurationManager.cs @@ -106,7 +106,7 @@ public static void Save(string filename, Feature[] features) try { var content = new StringBuilder(); - content.AppendLine(Strings.CommandSaveHeader); + content.AppendLine(Comment(Strings.CommandSaveHeader)); content.AppendLine(); foreach (var feature in features.OrderBy(f => f.GetType().FullName)) @@ -119,9 +119,9 @@ public static void Save(string filename, Feature[] features) var key = $"{featureType.FullName}.{op.Property.Name}"; var value = JsonConvert.SerializeObject(op.Property.GetValue(feature), Formatting.None, Converters); - var comment = op.Attribute.Comment; - if (!string.IsNullOrEmpty(comment)) - content.AppendLine($"; {comment}"); + var resourceId = op.Attribute.CommentResourceId; + if (!string.IsNullOrEmpty(resourceId)) + content.AppendLine(Comment(Strings.ResourceManager.GetString(resourceId))); content.AppendLine($"{key}={value}"); } @@ -139,6 +139,16 @@ public static void Save(string filename, Feature[] features) } } + private static string Comment(string? value) + { + if (string.IsNullOrEmpty(value)) + return string.Empty; + + const string commentToken = "; "; + + return commentToken + value!.Replace(Environment.NewLine, Environment.NewLine + commentToken); + } + public static void SavePropertyValue(string filename, Feature feature, string propertyName) { try diff --git a/Configuration/ConfigurationPropertyAttribute.cs b/Configuration/ConfigurationPropertyAttribute.cs index 7466d0d4..64101e75 100644 --- a/Configuration/ConfigurationPropertyAttribute.cs +++ b/Configuration/ConfigurationPropertyAttribute.cs @@ -9,6 +9,6 @@ public class ConfigurationPropertyAttribute : Attribute { public bool Skip { get; set; } = false; public int Order { get; set; } = int.MaxValue; - public string Comment { get; set; } = string.Empty; + public string CommentResourceId { get; set; } = string.Empty; public bool Browsable { get; set; } = true; } diff --git a/Features/LootItems.cs b/Features/LootItems.cs index 5ab849ee..fefbc11b 100644 --- a/Features/LootItems.cs +++ b/Features/LootItems.cs @@ -24,7 +24,7 @@ internal class LootItems : PointOfInterests [ConfigurationProperty] public Color Color { get; set; } = Color.cyan; - [ConfigurationProperty(Browsable = false, Comment = @"Example: [""foo"", ""bar""] or with extended properties: [{""Name"":""foo"",""Color"":[1.0,0.0,0.0,1.0]},{""Name"":""bar"",""Color"":[1.0,1.0,1.0,0.8],""Rarity"":""Rare""}]")] + [ConfigurationProperty(Browsable = false, CommentResourceId = nameof(Strings.PropertyTrackedNamesComment))] public List TrackedNames { get; set; } = []; [ConfigurationProperty] diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs index 14a9ffef..79efe30b 100644 --- a/Properties/Strings.Designer.cs +++ b/Properties/Strings.Designer.cs @@ -196,9 +196,9 @@ internal static string CommandSaveDescription { } /// - /// Looks up a localized string similar to ; Be careful when updating this file :) - ///; For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html - ///; Colors are stored as an array of 'RGBA' floats. + /// Looks up a localized string similar to Be careful when updating this file :) + ///For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html + ///Colors are stored as an array of 'RGBA' floats. /// internal static string CommandSaveHeader { get { @@ -2267,6 +2267,15 @@ internal static string PropertyThickness { } } + /// + /// Looks up a localized string similar to Example: ["foo", "bar"] or with extended properties: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}]. + /// + internal static string PropertyTrackedNamesComment { + get { + return ResourceManager.GetString("PropertyTrackedNamesComment", resourceCulture); + } + } + /// /// Looks up a localized string similar to Track Wishlist. /// diff --git a/Properties/Strings.resx b/Properties/Strings.resx index 54dae2d1..f926c4f3 100644 --- a/Properties/Strings.resx +++ b/Properties/Strings.resx @@ -754,9 +754,9 @@ Filename - ; Be careful when updating this file :) -; For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html -; Colors are stored as an array of 'RGBA' floats + Be careful when updating this file :) +For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html +Colors are stored as an array of 'RGBA' floats Saved {0} @@ -918,4 +918,7 @@ {0} ({1}) Condition description, quest name + + Example: ["foo", "bar"] or with extended properties: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}] + \ No newline at end of file From 429205b7770a09159c5ba1d0789797c916d8e1c0 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Wed, 10 Jul 2024 21:14:25 +0200 Subject: [PATCH 10/21] Sort strings --- Properties/Strings.resx | 962 ++++++++++++++++++++-------------------- 1 file changed, 481 insertions(+), 481 deletions(-) diff --git a/Properties/Strings.resx b/Properties/Strings.resx index f926c4f3..df711514 100644 --- a/Properties/Strings.resx +++ b/Properties/Strings.resx @@ -117,329 +117,549 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - aimbot - - - Aimbot. Automatic aiming and/or shooting (SilentAim). - - - ammo + + dump - - Unlimited ammo. + + Dumping game objects... - - autogun + + Dumping Scenes... - - Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate. + + Dump created in {0} + Filename - - N + + list - - NE + + {0} [{1}] {2} + Item name, count, optional rarity - - E + + listr - - SE + + ({0}) + Rarity - - Patched {0} with {1} - Method names + + Found {0} item(s) + Item count - - S + + listsr - - SW + + Load settings - - W + + load - - NW + + Loaded {0} + Filename - - commands + + loadtl - - This main popup window. + + Save settings - - load + + Be careful when updating this file :) +For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html +Colors are stored as an array of 'RGBA' floats save - - crosshair + + Saved {0} + Filename - - Crosshair with customizable size, color, thickness and auto-hide feature when aiming. + + savetl - - durability + + spawn - - Maximum durability of items. + + status - - examine + + {0} is {1} {2} + Feature name, status, optional toggle text if a key is set - - All items already examined. Instant search. + + ({0} to toggle) + Key - - exfil + + template - - Exfiltration points with customizable colors given eligibility, status filter, distance. + + {0}: {1} [{2}] + Template id, short-name, name - - Activate + + Found {0} template(s) + Template count - - Timer + + track - - Closed + + tracklist - - Pending + + Tracking: {0} {1} + Item short-name, optional rarity - - Open + + ({0}) + Rarity - - Requirement + + Tracking list updated... - - Cannot find original method {0} - Method name + + Tracking: {0} (Wishlist) + Item short-name - - Cannot find prefix method {0} - Method name + + trackr - - Cannot find postfix method {0} - Method name + + tracksr - - [summary] + + untrack - - Welcome to EFT Trainer ! + + Patched {0} with {1} + Method names - - Load settings + + Refreshed {0} in {1}ms + Type name, elapsed milliseconds - - Save settings + + Registering {0} command... + Command name - - Unsupported type: {0} - Property type-name + + Registering {0} command with arguments... + Command name - - fovchanger + + E - - Change Field Of View (FOV). + + N - - camera + + NE - - Free camera with fast mode and teleportation. + + NW - - gamestate + + S - - Refresh all game information for other features. + + SE - - ghost + + SW - - Stop bots from seeing you. + + W - - grenade + + Unable to find {0} on {1} + Field name, type name - - Grenades outline. + + Cannot find original method {0} + Method name - - health + + Cannot find postfix method {0} + Method name - - Full health, prevent any damage (so even when falling), keep energy and hydration at maximum. + + Cannot find prefix method {0} + Method name - - hits + + Unable to load {0}. {1} + Filename, error message - - Hit markers (hit, armor, health with configurable colors). + + Unable to save {0}. {1} + Filename, error message - - hud + + {0} seems corrupted. Please fix + Filename - - HUD (compass, ammo left in chamber / magazine, fire mode, coordinates). + + {0} seems corrupted in {1}. Please fix + Key, filename - - interact + + Failed to create item! + + + Failed to load item bundle! + + + {0} not found! + Filename + + + Invalid arguments + + + No template found! + + + Found {0} templates, be more specific + Template count > 1 + + + Unsupported type: {0} + Property type-name + + + Aimbot. Automatic aiming and/or shooting (SilentAim). + + + aimbot + + + Unlimited ammo. + + + ammo + + + Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate. + + + autogun + + + Free camera with fast mode and teleportation. + + + camera + + + This main popup window. + + + commands + + + EFT Trainer + + + Crosshair with customizable size, color, thickness and auto-hide feature when aiming. + + + crosshair + + + Maximum durability of items. + + + durability + + + All items already examined. Instant search. + + + examine + + + Exfiltration points with customizable colors given eligibility, status filter, distance. + + + {0} ({1}) + Name, status + + + exfil + + + Activate + + + Closed + + + Open + + + Pending + + + Requirement + + + Timer + + + Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet. + + + Change Field Of View (FOV). + + + fovchanger + + + Refresh all game information for other features. + + + gamestate + + + Stop bots from seeing you. + + + ghost + + + Grenades outline. + + + grenade + + + Full health, prevent any damage (so even when falling), keep energy and hydration at maximum. + + + health + + + Hit markers (hit, armor, health with configurable colors). + + + hits + + + ({0},{1}) + X, y + + + HUD (compass, ammo left in chamber / magazine, fire mode, coordinates). + + + hud + + + - + + + {0}+{1}/{2} [{3}] + Magazine count, chamber count, magazine capacity, fire-mode Change distance for loot/door interaction. - - stash + + interact - - Hidden/special stashes like buried barrels, ground caches, air drops or corpses. + + List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display. loot - - List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display. + + Full screen map with radar esp. map - - Full screen map with radar esp. + + Night vision. night - - Night vision. + + No physical collisions, making you immune to bullets, grenades and barbed wires. nocoll - - No physical collisions, making you immune to bullets, grenades and barbed wires. + + No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating. nomal - - No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating. + + No recoil. norecoil - - No recoil. + + No sway. nosway - - No sway. + + No visor, so even when using a face shield-visor you won't see it. novisor - - No visor, so even when using a face shield-visor you won't see it. + + Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance. + + + {0} {1}% {2} + Weapon name, health %, distance wallhack - - Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance. + + [{0}m] + Distance - - quest + + {0} {1} {2} + Name, optional formatted owner, optional formatted distance + + + >> In {0} {1} + Owner, distance + + + (in {0}) + Owner Locations for taking/placing quest items. Only items related to your started quests are displayed. - - quickthrow + + {0} ({1}) + Condition description, quest name + + + quest Quick-throw grenades. - - radar + + quickthrow 2D radar. - - skills + + radar + + + [summary] + + + Welcome to EFT Trainer ! All skills to Elite level (51) and all weapons mastering to level 3. - - speed + + skills Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself. - - stamina + + speed Unlimited stamina. - - thermal + + stamina - - Thermal vision. + + Hidden/special stashes like buried barrels, ground caches, air drops or corpses. - - train + + stash + + + Thermal vision. + + + thermal Summon train on compatible maps like Reserve or Lighthouse. + + train + wallshoot - - Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet. + + Clear weather. weather - - Clear weather. + + Door/Keycard reader/Car unlocker. opener - - Door/Keycard reader/Car unlocker. - Armor-damage color Backward + + Bear colors + + + Border color + + + Boss colors + + + Box thickness + Cache time (sec) + + Camera offset + Change time Color + + Cultist colors + Display time @@ -494,12 +714,21 @@ Hit-marker color + + Info color + + + Intensity + Key Left + + Marksman colors + Maximum distance @@ -509,6 +738,24 @@ Not eligible color + + Not shootable colors + + + Radar background + + + Radar crosshair + + + Radar percentage + + + Radar range + + + Range + Rate @@ -518,18 +765,51 @@ Right + + Rogue-Usec colors + + + Scav-assault colors + + + Scav colors + + + Scav-raider colors + + + Search inside containers + + + Search inside corpses + + + Shootable colors + Show armor damage Show bosses + + Show boxes + + + Show charms + Show compass + + Show containers + Show coordinates + + Show corpses + Show cultists @@ -545,15 +825,27 @@ Show Hit-marker + + Show infos + + + Show map + Show marksmen Show not eligible + + Show not shootable + Show players + + Show prices + Show rogues @@ -566,6 +858,12 @@ Show Scavs + + Show shootable + + + Show skeletons + Silent aim @@ -578,6 +876,9 @@ Size + + Skeleton thickness + Smoothness @@ -590,110 +891,8 @@ Thickness - - Vitals only - - - X - - - Y - - - Bear colors - - - Border color - - - Boss colors - - - Box thickness - - - Cultist colors - - - Info color - - - Intensity - - - Marksman colors - - - Not shootable colors - - - Radar background - - - Radar crosshair - - - Radar percentage - - - Radar range - - - Range - - - Rogue-Usec colors - - - Scav-assault colors - - - Scav colors - - - Scav-raider colors - - - Search inside containers - - - Search inside corpses - - - Shootable colors - - - Show boxes - - - Show charms - - - Show containers - - - Show corpses - - - Show infos - - - Show map - - - Show not shootable - - - Show prices - - - Show shootable - - - Show skeletons - - - Skeleton thickness + + Example: ["foo", "bar"] or with extended properties: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}] Track Wishlist @@ -701,118 +900,17 @@ Usec colors - - XRay-Vision - - - Camera offset - - - dump - - - list - - - listr - - - listsr - - - loadtl - - - savetl - - - spawn - - - status - - - template - - - track - - - tracklist - - - trackr - - - tracksr - - - untrack - - - Loaded {0} - Filename - - - Be careful when updating this file :) -For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html -Colors are stored as an array of 'RGBA' floats - - - Saved {0} - Filename - - - {0} seems corrupted. Please fix - Filename - - - {0} seems corrupted in {1}. Please fix - Key, filename - - - {0} not found! - Filename - - - Unable to load {0}. {1} - Filename, error message - - - Unable to save {0}. {1} - Filename, error message - - - {0} [{1}] {2} - Item name, count, optional rarity - - - Found {0} item(s) - Item count - - - Registering {0} command... - Command name - - - Registering {0} command with arguments... - Command name - - - Invalid arguments - - - ------ + + Vitals only - - Dumping game objects... + + X - - Dumping Scenes... + + XRay-Vision - - Dump created in {0} - Filename + + Y off @@ -820,105 +918,7 @@ Colors are stored as an array of 'RGBA' floats on - - No template found! - - - Failed to load item bundle! - - - Failed to create item! - - - {0} is {1} {2} - Feature name, status, optional toggle text if a key is set - - - ({0} to toggle) - Key - - - {0}: {1} [{2}] - Template id, short-name, name - - - Found {0} template(s) - Template count - - - Tracking: {0} {1} - Item short-name, optional rarity - - - Tracking list updated... - - - Tracking: {0} (Wishlist) - Item short-name - - - Found {0} templates, be more specific - Template count > 1 - - - Refreshed {0} in {1}ms - Type name, elapsed milliseconds - - - EFT Trainer - - - ({0}) - Rarity - - - ({0}) - Rarity - - - Unable to find {0} on {1} - Field name, type name - - - {0} ({1}) - Name, status - - - ({0},{1}) - X, y - - - - - - - {0}+{1}/{2} [{3}] - Magazine count, chamber count, magazine capacity, fire-mode - - - {0} {1}% {2} - Weapon name, health %, distance - - - [{0}m] - Distance - - - {0} {1} {2} - Name, optional formatted owner, optional formatted distance - - - >> In {0} {1} - Owner, distance - - - (in {0}) - Owner - - - {0} ({1}) - Condition description, quest name - - - Example: ["foo", "bar"] or with extended properties: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}] + + ------ \ No newline at end of file From 61f0c0f3fc84b6f0fb748227a7dde0c8cbd5c3ae Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 10:47:26 +0200 Subject: [PATCH 11/21] Prototyping adding french translations --- BepInExPlugin/Properties/AssemblyInfo.cs | 2 +- NLog.EFT.Trainer.csproj | 10 + Properties/AssemblyInfo.cs | 2 +- Properties/Strings.fr.Designer.cs | 0 Properties/Strings.fr.resx | 924 +++++++++++++++++++++++ 5 files changed, 936 insertions(+), 2 deletions(-) create mode 100644 Properties/Strings.fr.Designer.cs create mode 100644 Properties/Strings.fr.resx diff --git a/BepInExPlugin/Properties/AssemblyInfo.cs b/BepInExPlugin/Properties/AssemblyInfo.cs index 5af089eb..3600335a 100644 --- a/BepInExPlugin/Properties/AssemblyInfo.cs +++ b/BepInExPlugin/Properties/AssemblyInfo.cs @@ -2,4 +2,4 @@ [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyProduct("EFT Trainer, BepInEx plugin")] -[assembly: AssemblyCopyright("Copyright © 2023 Sebastien Lebreton")] +[assembly: AssemblyCopyright("Copyright © 2024 Sebastien Lebreton")] diff --git a/NLog.EFT.Trainer.csproj b/NLog.EFT.Trainer.csproj index 85973aac..898692db 100644 --- a/NLog.EFT.Trainer.csproj +++ b/NLog.EFT.Trainer.csproj @@ -209,6 +209,11 @@ + + Strings.fr.resx + True + True + True True @@ -228,6 +233,11 @@ + + ResXFileCodeGenerator + Strings.fr.Designer.cs + Designer + ResXFileCodeGenerator Strings.Designer.cs diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 654cb802..f16bb424 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -2,4 +2,4 @@ [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyProduct("EFT Trainer")] -[assembly: AssemblyCopyright("Copyright © 2023 Sebastien Lebreton")] +[assembly: AssemblyCopyright("Copyright © 2024 Sebastien Lebreton")] diff --git a/Properties/Strings.fr.Designer.cs b/Properties/Strings.fr.Designer.cs new file mode 100644 index 00000000..e69de29b diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx new file mode 100644 index 00000000..c0b5b857 --- /dev/null +++ b/Properties/Strings.fr.resx @@ -0,0 +1,924 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + dump + + + Dumping game objects... + + + Dumping Scenes... + + + Dump created in {0} + Filename + + + list + + + {0} [{1}] {2} + Item name, count, optional rarity + + + listr + + + ({0}) + Rarity + + + Found {0} item(s) + Item count + + + listsr + + + Load settings + + + load + + + Loaded {0} + Filename + + + loadtl + + + Save settings + + + Be careful when updating this file :) +For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html +Colors are stored as an array of 'RGBA' floats + + + save + + + Saved {0} + Filename + + + savetl + + + spawn + + + status + + + {0} is {1} {2} + Feature name, status, optional toggle text if a key is set + + + ({0} to toggle) + Key + + + template + + + {0}: {1} [{2}] + Template id, short-name, name + + + Found {0} template(s) + Template count + + + track + + + tracklist + + + Tracking: {0} {1} + Item short-name, optional rarity + + + ({0}) + Rarity + + + Tracking list updated... + + + Tracking: {0} (Wishlist) + Item short-name + + + trackr + + + tracksr + + + untrack + + + Patched {0} with {1} + Method names + + + Refreshed {0} in {1}ms + Type name, elapsed milliseconds + + + Registering {0} command... + Command name + + + Registering {0} command with arguments... + Command name + + + E + + + N + + + NE + + + NW + + + S + + + SE + + + SW + + + W + + + Unable to find {0} on {1} + Field name, type name + + + Cannot find original method {0} + Method name + + + Cannot find postfix method {0} + Method name + + + Cannot find prefix method {0} + Method name + + + Unable to load {0}. {1} + Filename, error message + + + Unable to save {0}. {1} + Filename, error message + + + {0} seems corrupted. Please fix + Filename + + + {0} seems corrupted in {1}. Please fix + Key, filename + + + Failed to create item! + + + Failed to load item bundle! + + + {0} not found! + Filename + + + Invalid arguments + + + No template found! + + + Found {0} templates, be more specific + Template count > 1 + + + Unsupported type: {0} + Property type-name + + + Aimbot. Automatic aiming and/or shooting (SilentAim). + + + aimbot + + + Unlimited ammo. + + + ammo + + + Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate. + + + autogun + + + Free camera with fast mode and teleportation. + + + camera + + + This main popup window. + + + commands + + + EFT Trainer + + + Crosshair with customizable size, color, thickness and auto-hide feature when aiming. + + + crosshair + + + Maximum durability of items. + + + durability + + + All items already examined. Instant search. + + + examine + + + Exfiltration points with customizable colors given eligibility, status filter, distance. + + + {0} ({1}) + Name, status + + + exfil + + + Activate + + + Closed + + + Open + + + Pending + + + Requirement + + + Timer + + + Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet. + + + Change Field Of View (FOV). + + + fovchanger + + + Refresh all game information for other features. + + + gamestate + + + Stop bots from seeing you. + + + ghost + + + Grenades outline. + + + grenade + + + Full health, prevent any damage (so even when falling), keep energy and hydration at maximum. + + + health + + + Hit markers (hit, armor, health with configurable colors). + + + hits + + + ({0},{1}) + X, y + + + HUD (compass, ammo left in chamber / magazine, fire mode, coordinates). + + + hud + + + - + + + {0}+{1}/{2} [{3}] + Magazine count, chamber count, magazine capacity, fire-mode + + + Change distance for loot/door interaction. + + + interact + + + List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display. + + + loot + + + Full screen map with radar esp. + + + map + + + Night vision. + + + night + + + No physical collisions, making you immune to bullets, grenades and barbed wires. + + + nocoll + + + No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating. + + + nomal + + + No recoil. + + + norecoil + + + No sway. + + + nosway + + + No visor, so even when using a face shield-visor you won't see it. + + + novisor + + + Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance. + + + {0} {1}% {2} + Weapon name, health %, distance + + + wallhack + + + [{0}m] + Distance + + + {0} {1} {2} + Name, optional formatted owner, optional formatted distance + + + >> In {0} {1} + Owner, distance + + + (in {0}) + Owner + + + Locations for taking/placing quest items. Only items related to your started quests are displayed. + + + {0} ({1}) + Condition description, quest name + + + quest + + + Quick-throw grenades. + + + quickthrow + + + 2D radar. + + + radar + + + [summary] + + + Welcome to EFT Trainer ! + + + All skills to Elite level (51) and all weapons mastering to level 3. + + + skills + + + Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself. + + + speed + + + Unlimited stamina. + + + stamina + + + Hidden/special stashes like buried barrels, ground caches, air drops or corpses. + + + stash + + + Thermal vision. + + + thermal + + + Summon train on compatible maps like Reserve or Lighthouse. + + + train + + + wallshoot + + + Clear weather. + + + weather + + + Door/Keycard reader/Car unlocker. + + + opener + + + Couleur des dommages armure + + + Arrière + + + Couleurs Bear + + + Couleur bordure + + + Couleurs Boss + + + Epaisseur boîte + + + Durée de cache (sec) + + + Offset de camera + + + Changer l'heure + + + Couleur + + + Cultist colors + + + Afficher l'heure + + + Distance + + + Couleur éligible + + + Activé + + + Temps de fondu + + + Mode rapide + + + Fast movement speed + + + Nourriture / eau + + + En avant + + + Champ visuel + + + Couleur du cercle du champ visuel + + + Epaisseur du cercle du champ visuel + + + Rayon du champ visuel + + + Sensibilité de la vision libre + + + Couleur de groupement + + + Couleur de dommage de vie + + + Cacher en cas de visée + + + Couleur du marqueur + + + Couleur d'information + + + Intensité + + + Touche + + + Gauche + + + Marksman colors + + + Maximum distance + + + Movement speed + + + Not eligible color + + + Not shootable colors + + + Radar background + + + Radar crosshair + + + Radar percentage + + + Radar range + + + Range + + + Rate + + + Remove negative effects + + + Right + + + Rogue-Usec colors + + + Scav-assault colors + + + Scav colors + + + Scav-raider colors + + + Search inside containers + + + Search inside corpses + + + Shootable colors + + + Show armor damage + + + Show bosses + + + Show boxes + + + Show charms + + + Show compass + + + Show containers + + + Show coordinates + + + Show corpses + + + Show cultists + + + Show eligible + + + Show fov circle + + + Show health-damage + + + Show Hit-marker + + + Show infos + + + Show map + + + Show marksmen + + + Show not eligible + + + Show not shootable + + + Show players + + + Show prices + + + Show rogues + + + Show Scav-assaults + + + Show Scav-raiders + + + Show Scavs + + + Show shootable + + + Show skeletons + + + Silent aim + + + Silent aim next-shot-delay + + + Silent aim speed-factor + + + Size + + + Skeleton thickness + + + Smoothness + + + Status filter + + + Teleport + + + Thickness + + + Example: ["foo", "bar"] or with extended properties: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}] + + + Track Wishlist + + + Usec colors + + + Vitals only + + + X + + + XRay-Vision + + + Y + + + off + + + on + + + ------ + + \ No newline at end of file From 53048efdc635817883b99f3b1336c3a32e9d99b3 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 15:42:39 +0200 Subject: [PATCH 12/21] Add language switch to the installer --- Installer/CompilationContext.cs | 1 + Installer/Compiler.cs | 17 ++++++++++++++++- Installer/InstallCommand.cs | 20 +++++++++++++++++--- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Installer/CompilationContext.cs b/Installer/CompilationContext.cs index f56a297f..9b0fcfc1 100644 --- a/Installer/CompilationContext.cs +++ b/Installer/CompilationContext.cs @@ -14,4 +14,5 @@ internal class CompilationContext(Installation installation, string projectTitle public string[] Exclude { get; set; } = []; public ZipArchive? Archive { get; set; } public bool IsFatalFailure { get; set; } = false; + public string Language { get; set; } = ""; } diff --git a/Installer/Compiler.cs b/Installer/Compiler.cs index a31e76d5..1fb51e79 100644 --- a/Installer/Compiler.cs +++ b/Installer/Compiler.cs @@ -159,7 +159,17 @@ private IEnumerable GetSyntaxTrees() } } - public IEnumerable GetResources() + public bool IsLocalizationSupported() + { + return IsLanguageSupported(null); + } + + public bool IsLanguageSupported(CompilationContext? context) + { + return GetSourceFiles().Any(f => f.EndsWith(string.Concat("Strings.", context?.Language ?? string.Empty, ".Designer.cs").Replace("..","."), StringComparison.OrdinalIgnoreCase)); + } + + public IEnumerable GetResources(CompilationContext context) { var matches = ResourceFileRegex().Matches(ProjectContent); @@ -168,7 +178,11 @@ public IEnumerable GetResources() if (!match.Success) continue; + // For now we only select one resource file, and use it as "neutral" var file = match.Groups["file"].Value; + if (!file.EndsWith(string.Concat("Strings.", context.Language, ".resx").Replace("..","."), StringComparison.OrdinalIgnoreCase)) + continue; + var entry = ProjectArchive.Entries.FirstOrDefault(e => e.FullName.EndsWith(file.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar), StringComparison.OrdinalIgnoreCase)); if (entry == null) continue; @@ -191,6 +205,7 @@ public IEnumerable GetResources() var resourceName = file .Replace(@"Properties\Strings", "EFT.Trainer.Properties.Strings") + .Replace($".{context.Language}.", ".", StringComparison.OrdinalIgnoreCase) .Replace(".resx", ".resources"); yield return new ResourceDescription(resourceName, () => resource, isPublic: true); diff --git a/Installer/InstallCommand.cs b/Installer/InstallCommand.cs index cdfc8fee..2a433677 100644 --- a/Installer/InstallCommand.cs +++ b/Installer/InstallCommand.cs @@ -38,6 +38,10 @@ internal class Settings : CommandSettings [Description("Disable command.")] [CommandOption("-c|--command")] public string[]? DisabledCommands { get; set; } + + [Description("Language.")] + [CommandOption("-l|--language")] + public string Language { get; set; } = ""; } public static string[] ToSourceFile(string[]? names, string folder) @@ -147,7 +151,8 @@ private static async Task BuildTrainerAsync(Settings settings var context = new CompilationContext(installation, "trainer", "NLog.EFT.Trainer.csproj") { Exclude = [.. settings.DisabledFeatures!, .. settings.DisabledCommands!], - Branch = GetInitialBranch(settings) + Branch = GetInitialBranch(settings), + Language = settings.Language }; var result = await GetCompilationAsync(context); @@ -273,10 +278,19 @@ private static async Task GetCompilationAsync(CompilationCont else { resources = compiler - .GetResources() + .GetResources(context) .ToArray(); - AnsiConsole.MarkupLine($">> [blue]Try #{context.Try}[/] Compilation [green]succeed[/] for [blue]{context.Branch.EscapeMarkup()}[/] branch."); + if (compiler.IsLocalizationSupported() && !resources.Any()) + { + AnsiConsole.MarkupLine($"[yellow]Warning: no localization support for language '{context.Language.EscapeMarkup()}'.[/]"); + compilation = null; + context.IsFatalFailure = true; + } + else + { + AnsiConsole.MarkupLine($">> [blue]Try #{context.Try}[/] Compilation [green]succeed[/] for [blue]{context.Branch.EscapeMarkup()}[/] branch."); + } } }); From 2df81dc8cd898169d0a400a450daa016a2349fed Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 15:47:29 +0200 Subject: [PATCH 13/21] Update documentation --- .github/RELEASE_TEMPLATE/content.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/RELEASE_TEMPLATE/content.md b/.github/RELEASE_TEMPLATE/content.md index bc1c8172..022e6074 100644 --- a/.github/RELEASE_TEMPLATE/content.md +++ b/.github/RELEASE_TEMPLATE/content.md @@ -47,5 +47,6 @@ This is an universal installer for the trainer. In most cases you just need to r - `Installer -c ` to disable a command. Example: `Installer -c Spawn`. - `Installer uninstall` to remove the trainer. - `Installer uninstall "C:\Battlestate Games\EFT"` to remove the trainer, adding `C:\Battlestate Games\EFT` to the search list. +- `Installer -l ` to compile the trainer for a specific language (like `fr`). See the supported ones [here](https://github.com/sailro/EscapeFromTarkov-Trainer/tree/master/Properties). [![Sponsor](https://img.shields.io/badge/sponsor-%E2%9D%A4-lightgrey?logo=github&style=flat-square)](https://github.com/sponsors/sailro) \ No newline at end of file From 285e4c81c00c8b0df91e8c86e0cf631f16361984 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 16:09:37 +0200 Subject: [PATCH 14/21] Complete property translation --- Properties/Strings.Designer.cs | 8 +-- Properties/Strings.fr.resx | 128 ++++++++++++++++----------------- Properties/Strings.resx | 8 +-- 3 files changed, 72 insertions(+), 72 deletions(-) diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs index 79efe30b..ab5084e0 100644 --- a/Properties/Strings.Designer.cs +++ b/Properties/Strings.Designer.cs @@ -1962,7 +1962,7 @@ internal static string PropertyShowArmorDamage { } /// - /// Looks up a localized string similar to Show bosses. + /// Looks up a localized string similar to Show Bosses. /// internal static string PropertyShowBosses { get { @@ -2025,7 +2025,7 @@ internal static string PropertyShowCorpses { } /// - /// Looks up a localized string similar to Show cultists. + /// Looks up a localized string similar to Show Cultists. /// internal static string PropertyShowCultists { get { @@ -2088,7 +2088,7 @@ internal static string PropertyShowMap { } /// - /// Looks up a localized string similar to Show marksmen. + /// Looks up a localized string similar to Show Marksmen. /// internal static string PropertyShowMarksmen { get { @@ -2133,7 +2133,7 @@ internal static string PropertyShowPrices { } /// - /// Looks up a localized string similar to Show rogues. + /// Looks up a localized string similar to Show Rogues. /// internal static string PropertyShowRogues { get { diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx index c0b5b857..0354f4f9 100644 --- a/Properties/Strings.fr.resx +++ b/Properties/Strings.fr.resx @@ -634,13 +634,13 @@ Colors are stored as an array of 'RGBA' floats Arrière - Couleurs Bear + Couleurs des Bear Couleur bordure - Couleurs Boss + Couleurs des Boss Epaisseur boîte @@ -658,7 +658,7 @@ Colors are stored as an array of 'RGBA' floats Couleur - Cultist colors + Couleurs des Cultists Afficher l'heure @@ -679,7 +679,7 @@ Colors are stored as an array of 'RGBA' floats Mode rapide - Fast movement speed + Vitesse de mouvement rapide Nourriture / eau @@ -727,187 +727,187 @@ Colors are stored as an array of 'RGBA' floats Gauche - Marksman colors + Couleurs des Snipers - Maximum distance + Distance maximum - Movement speed + Vitesse de mouvement - Not eligible color + Couleur non-éligible - Not shootable colors + Couleurs pour les non-cibles - Radar background + Arrière-plan du radar - Radar crosshair + Réticule radar - Radar percentage + Pourcentage du radar - Radar range + Portée du radar - Range + Portée - Rate + Taux - Remove negative effects + Supprimer les effets négatifs - Right + Gauche - Rogue-Usec colors + Couleurs des Rogue-Usec - Scav-assault colors + Couleurs des Scav-assault - Scav colors + Couleurs des Scav - Scav-raider colors + Couleurs des Scav-raider - Search inside containers + Chercher dans les conteneurs - Search inside corpses + Chercher dans les corps - Shootable colors + Couleurs pour les cibles - Show armor damage + Montrer les dommages de l'armure - Show bosses + Montrer les Boss - Show boxes + Montrer les boites - Show charms + Montrer les silhouettes - Show compass + Montrer la boussole - Show containers + Montrer les conteneurs - Show coordinates + Montrer les coordonnées - Show corpses + Montrer les corps - Show cultists + Montrer les Cultistes - Show eligible + Montrer les éligibles - Show fov circle + Montrer le cercle de vision - Show health-damage + Montrer les dommages de vie - Show Hit-marker + Montrer les marqueurs - Show infos + Montrer les infos - Show map + Montrer la carte - Show marksmen + Montrer les Snipers - Show not eligible + Montrer les non-éligibles - Show not shootable + Montrer les non-cibles - Show players + Montrer les joueurs - Show prices + Montrer les prix - Show rogues + Montrer les Rogues - Show Scav-assaults + Montrer les Scav-assaults - Show Scav-raiders + Montrer les Scav-raiders - Show Scavs + Montrer les Scavs - Show shootable + Montrer les cibles - Show skeletons + Montrer les squelettes - Silent aim + Visée silencieuse - Silent aim next-shot-delay + Delai du prochain tir de visée silencieuse - Silent aim speed-factor + Vitesse de visée silencieuse - Size + Taille - Skeleton thickness + Epaisseur du Squelette - Smoothness + Lissage - Status filter + Filtre de statut - Teleport + Teleporter - Thickness + Epaisseur - Example: ["foo", "bar"] or with extended properties: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}] + Exemple: ["foo", "bar"] ou avec des propriétés étendues: [{"Name":"foo","Color":[1.0,0.0,0.0,1.0]},{"Name":"bar","Color":[1.0,1.0,1.0,0.8],"Rarity":"Rare"}] - Track Wishlist + Suivre la liste de souhaits - Usec colors + Couleurs des Usec - Vitals only + Organes vitaux uniquement X - XRay-Vision + Vision à rayons X Y diff --git a/Properties/Strings.resx b/Properties/Strings.resx index df711514..8e373783 100644 --- a/Properties/Strings.resx +++ b/Properties/Strings.resx @@ -790,7 +790,7 @@ Colors are stored as an array of 'RGBA' floats Show armor damage - Show bosses + Show Bosses Show boxes @@ -811,7 +811,7 @@ Colors are stored as an array of 'RGBA' floats Show corpses - Show cultists + Show Cultists Show eligible @@ -832,7 +832,7 @@ Colors are stored as an array of 'RGBA' floats Show map - Show marksmen + Show Marksmen Show not eligible @@ -847,7 +847,7 @@ Colors are stored as an array of 'RGBA' floats Show prices - Show rogues + Show Rogues Show Scav-assaults From ef2269b2de1b53543b2a0ff1969aed26b8095a5b Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 16:33:49 +0200 Subject: [PATCH 15/21] Refine --- Properties/Strings.fr.resx | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx index 0354f4f9..68d7c3ed 100644 --- a/Properties/Strings.fr.resx +++ b/Properties/Strings.fr.resx @@ -628,7 +628,7 @@ Colors are stored as an array of 'RGBA' floats opener - Couleur des dommages armure + Couleur impact armure Arrière @@ -661,7 +661,7 @@ Colors are stored as an array of 'RGBA' floats Couleurs des Cultists - Afficher l'heure + Temps d'affichage Distance @@ -679,7 +679,7 @@ Colors are stored as an array of 'RGBA' floats Mode rapide - Vitesse de mouvement rapide + Vitesse mouvement rapide Nourriture / eau @@ -691,22 +691,22 @@ Colors are stored as an array of 'RGBA' floats Champ visuel - Couleur du cercle du champ visuel + Couleur du cercle visuel - Epaisseur du cercle du champ visuel + Epaisseur du cercle visuel Rayon du champ visuel - Sensibilité de la vision libre + Sensibilité vision libre Couleur de groupement - Couleur de dommage de vie + Couleur impact santé Cacher en cas de visée @@ -760,7 +760,7 @@ Colors are stored as an array of 'RGBA' floats Taux - Supprimer les effets négatifs + Supprimer effets négatifs Gauche @@ -778,16 +778,16 @@ Colors are stored as an array of 'RGBA' floats Couleurs des Scav-raider - Chercher dans les conteneurs + Chercher les conteneurs - Chercher dans les corps + Chercher les corps Couleurs pour les cibles - Montrer les dommages de l'armure + Montrer impacts armure Montrer les Boss @@ -817,10 +817,10 @@ Colors are stored as an array of 'RGBA' floats Montrer les éligibles - Montrer le cercle de vision + Montrer le cercle visuel - Montrer les dommages de vie + Montrer impacts santé Montrer les marqueurs @@ -868,10 +868,10 @@ Colors are stored as an array of 'RGBA' floats Visée silencieuse - Delai du prochain tir de visée silencieuse + Delai du prochain tir - Vitesse de visée silencieuse + Vitesse de visée Taille @@ -901,7 +901,7 @@ Colors are stored as an array of 'RGBA' floats Couleurs des Usec - Organes vitaux uniquement + Organes vitaux seulement X From 69ba56917dbe7e5804cd3af639bbf30a732965ce Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 16:46:35 +0200 Subject: [PATCH 16/21] Refine again --- Properties/Strings.fr.resx | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx index 68d7c3ed..3efb4ad6 100644 --- a/Properties/Strings.fr.resx +++ b/Properties/Strings.fr.resx @@ -634,13 +634,13 @@ Colors are stored as an array of 'RGBA' floats Arrière - Couleurs des Bear + Couleurs Bear Couleur bordure - Couleurs des Boss + Couleurs Boss Epaisseur boîte @@ -658,7 +658,7 @@ Colors are stored as an array of 'RGBA' floats Couleur - Couleurs des Cultists + Couleurs Cultistes Temps d'affichage @@ -679,25 +679,25 @@ Colors are stored as an array of 'RGBA' floats Mode rapide - Vitesse mouvement rapide + Vitesse de mvt. rapide Nourriture / eau - En avant + Avant Champ visuel - Couleur du cercle visuel + Couleur champ visuel - Epaisseur du cercle visuel + Epaisseur champ visuel - Rayon du champ visuel + Rayon champ visuel Sensibilité vision libre @@ -727,7 +727,7 @@ Colors are stored as an array of 'RGBA' floats Gauche - Couleurs des Snipers + Couleurs Snipers Distance maximum @@ -739,7 +739,7 @@ Colors are stored as an array of 'RGBA' floats Couleur non-éligible - Couleurs pour les non-cibles + Couleurs des non-cibles Arrière-plan du radar @@ -757,25 +757,25 @@ Colors are stored as an array of 'RGBA' floats Portée - Taux + Cadence Supprimer effets négatifs - Gauche + Droite - Couleurs des Rogue-Usec + Couleurs Rogue-Usec - Couleurs des Scav-assault + Couleurs Scav-assault - Couleurs des Scav + Couleurs Scav - Couleurs des Scav-raider + Couleurs Scav-raider Chercher les conteneurs @@ -784,7 +784,7 @@ Colors are stored as an array of 'RGBA' floats Chercher les corps - Couleurs pour les cibles + Couleurs des cibles Montrer impacts armure @@ -898,7 +898,7 @@ Colors are stored as an array of 'RGBA' floats Suivre la liste de souhaits - Couleurs des Usec + Couleurs Usec Organes vitaux seulement From 52a620fd69cbe3d296daa9232b967145deacd0d0 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 16:54:36 +0200 Subject: [PATCH 17/21] Refine again and again --- Properties/Strings.fr.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx index 3efb4ad6..1a56526b 100644 --- a/Properties/Strings.fr.resx +++ b/Properties/Strings.fr.resx @@ -877,7 +877,7 @@ Colors are stored as an array of 'RGBA' floats Taille - Epaisseur du Squelette + Epaisseur du squelette Lissage From 2bb85eb29ac2899d6710fbfc0585aba59b5d6d5c Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 16:57:39 +0200 Subject: [PATCH 18/21] Fix --- Properties/Strings.fr.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx index 1a56526b..e07d7809 100644 --- a/Properties/Strings.fr.resx +++ b/Properties/Strings.fr.resx @@ -817,7 +817,7 @@ Colors are stored as an array of 'RGBA' floats Montrer les éligibles - Montrer le cercle visuel + Montrer le champ visuel Montrer impacts santé From 753c1c781135187e7cc0ff2a286f3f454c9b785e Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 18:10:02 +0200 Subject: [PATCH 19/21] Finalize translation --- EFT.Trainer.sln | 2 +- Properties/Strings.Designer.cs | 2 +- Properties/Strings.fr.resx | 158 ++++++++++++++++----------------- Properties/Strings.resx | 2 +- 4 files changed, 82 insertions(+), 82 deletions(-) diff --git a/EFT.Trainer.sln b/EFT.Trainer.sln index a1e18885..9e37f211 100644 --- a/EFT.Trainer.sln +++ b/EFT.Trainer.sln @@ -5,7 +5,7 @@ VisualStudioVersion = 17.4.33205.214 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NLog.EFT.Trainer", "NLog.EFT.Trainer.csproj", "{F4EB56B6-F914-11E9-AAD5-362B9E155667}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Installer", "Installer\Installer.csproj", "{C7DC685F-89CE-4BA1-8F95-41DA8E18F585}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Installer", "Installer\Installer.csproj", "{C7DC685F-89CE-4BA1-8F95-41DA8E18F585}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BepInExPlugin", "BepInExPlugin\BepInExPlugin.csproj", "{00C66BBD-ED7F-4E01-B7E4-0388F76FD31C}" EndProject diff --git a/Properties/Strings.Designer.cs b/Properties/Strings.Designer.cs index ab5084e0..e41d6fc8 100644 --- a/Properties/Strings.Designer.cs +++ b/Properties/Strings.Designer.cs @@ -1314,7 +1314,7 @@ internal static string FeatureRendererSummary { } /// - /// Looks up a localized string similar to Welcome to EFT Trainer !. + /// Looks up a localized string similar to Welcome to EFT-Trainer !. /// internal static string FeatureRendererWelcome { get { diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx index e07d7809..5ea3161e 100644 --- a/Properties/Strings.fr.resx +++ b/Properties/Strings.fr.resx @@ -121,13 +121,13 @@ dump - Dumping game objects... + Analyse des objets du jeu... - Dumping Scenes... + Analyse des scenes... - Dump created in {0} + Analyse crée dans {0} Filename @@ -145,38 +145,38 @@ Rarity - Found {0} item(s) + {0} objet(s) trouvé(s) Item count listsr - Load settings + Charger les réglages load - Loaded {0} + Chargement de {0} Filename loadtl - Save settings + Enregistrer les réglages - Be careful when updating this file :) -For keys, use https://docs.unity3d.com/ScriptReference/KeyCode.html -Colors are stored as an array of 'RGBA' floats + Soyez prudent lorsque vous mettez à jour ce fichier :) +Pour les clés, utilisez https://docs.unity3d.com/ScriptReference/KeyCode.html +Les couleurs sont stockées sous la forme d'un tableau de valeurs flottantes 'RGBA' save - Saved {0} + Enregistrement de {0} Filename @@ -189,11 +189,11 @@ Colors are stored as an array of 'RGBA' floats status - {0} is {1} {2} + {0} est {1} {2} Feature name, status, optional toggle text if a key is set - ({0} to toggle) + ({0} pour basculer) Key @@ -204,7 +204,7 @@ Colors are stored as an array of 'RGBA' floats Template id, short-name, name - Found {0} template(s) + {0} template(s) trouvée(s) Template count @@ -214,7 +214,7 @@ Colors are stored as an array of 'RGBA' floats tracklist - Tracking: {0} {1} + Suivi: {0} {1} Item short-name, optional rarity @@ -222,10 +222,10 @@ Colors are stored as an array of 'RGBA' floats Rarity - Tracking list updated... + Liste de suivi mise à jour... - Tracking: {0} (Wishlist) + Suivi: {0} (Liste de souhaits) Item short-name @@ -238,19 +238,19 @@ Colors are stored as an array of 'RGBA' floats untrack - Patched {0} with {1} + Modification de {0} avec {1} Method names - Refreshed {0} in {1}ms + Rafraichissement de {0} en {1}ms Type name, elapsed milliseconds - Registering {0} command... + Enregistrement de la commande {0}... Command name - Registering {0} command with arguments... + Enregistrement de la commande {0} avec des arguments... Command name @@ -263,7 +263,7 @@ Colors are stored as an array of 'RGBA' floats NE - NW + NO S @@ -272,93 +272,93 @@ Colors are stored as an array of 'RGBA' floats SE - SW + SO - W + O - Unable to find {0} on {1} + Impossible de trouver {0} dans {1} Field name, type name - Cannot find original method {0} + Impossible de trouver la méthode originale {0} Method name - Cannot find postfix method {0} + Impossible de trouver la méthode suffixe {0} Method name - Cannot find prefix method {0} + Impossible de trouver la méthode préfixe {0} Method name - Unable to load {0}. {1} + Impossible de charger {0}. {1} Filename, error message - Unable to save {0}. {1} + Impossible d'enregistrer {0}. {1} Filename, error message - {0} seems corrupted. Please fix + {0} semble corrompu. Merci de corriger Filename - {0} seems corrupted in {1}. Please fix + {0} semble corrompu dans {1}. Merci de corriger Key, filename - Failed to create item! + Impossible de créer l'objet! - Failed to load item bundle! + Impossible de charger le paquet! - {0} not found! + {0} introuvable! Filename - Invalid arguments + Arguments invalides - No template found! + Aucune template trouvée! - Found {0} templates, be more specific + {0} templates trouvées, essayez d'être plus spécficique Template count > 1 - Unsupported type: {0} + Type non supporté: {0} Property type-name - Aimbot. Automatic aiming and/or shooting (SilentAim). + Robot de visée. Visée et/ou tir automatique. aimbot - Unlimited ammo. + Munitions illimitées. ammo - Force all guns (even bolt action guns) to use automatic firing mode with customizable fire rate. + Force toutes les armes (même les fusils à verrou) à utiliser le mode de tir automatique avec une cadence de tir personnalisable. autogun - Free camera with fast mode and teleportation. + Caméra libre avec mode rapide et téléportation. camera - This main popup window. + Cette fenêtre principale. commands @@ -367,25 +367,25 @@ Colors are stored as an array of 'RGBA' floats EFT Trainer - Crosshair with customizable size, color, thickness and auto-hide feature when aiming. + Réticule dont la taille, la couleur et l'épaisseur sont personnalisables et qui se masque automatiquement lors de la visée. crosshair - Maximum durability of items. + Durabilité maximale des objets. durability - All items already examined. Instant search. + Tous les objets ont déjà été examinés. Recherche instantanée. examine - Exfiltration points with customizable colors given eligibility, status filter, distance. + Points d'exfiltration avec couleurs personnalisables en fonction de l'éligibilité, du filtre de statut, de la distance. {0} ({1}) @@ -413,40 +413,40 @@ Colors are stored as an array of 'RGBA' floats Timer - Shoot through wall/helmet/vest/material with maximum penetration and minimal deviation/ricochet. + Tirer à travers un mur, un casque, un gilet ou un matériau avec une pénétration maximale et une déviation/ricochet minimale. - Change Field Of View (FOV). + Modification du champ de vision. fovchanger - Refresh all game information for other features. + Rafraîchir toutes les informations sur le jeu pour d'autres fonctionnalités. gamestate - Stop bots from seeing you. + Empêcher les robots de vous voir. ghost - Grenades outline. + Aperçu des grenades. grenade - Full health, prevent any damage (so even when falling), keep energy and hydration at maximum. + Pleine santé, éviter tout dommage (même en cas de chute), maintenir l'énergie et l'hydratation au maximum. health - Hit markers (hit, armor, health with configurable colors). + Marqueurs d'impacts (armure, santé avec couleurs configurables). hits @@ -456,7 +456,7 @@ Colors are stored as an array of 'RGBA' floats X, y - HUD (compass, ammo left in chamber / magazine, fire mode, coordinates). + Affichage (boussole, munitions restantes dans la chambre / le chargeur, mode de tir, coordonnées). hud @@ -469,61 +469,61 @@ Colors are stored as an array of 'RGBA' floats Magazine count, chamber count, magazine capacity, fire-mode - Change distance for loot/door interaction. + Modifier la distance pour l'interaction avec le loot et les portes. interact - List all lootable items and track any item by name or rarity or in-game wishlist in raid (even in containers and corpses). Use track and tracklist commands to control display. + Liste de tous les objets à looter et suivi de n'importe quel objet par nom, rareté ou liste de souhaits dans le raid (même dans les conteneurs et les cadavres). Utilisez les commandes track et tracklist pour contrôler l'affichage. loot - Full screen map with radar esp. + Carte plein écran avec radar. map - Night vision. + Vision nocturne. night - No physical collisions, making you immune to bullets, grenades and barbed wires. + Pas de collisions physiques, ce qui vous immunise contre les balles, les grenades et les fils barbelés. nocoll - No weapon malfunctions: no misfires or failures to eject or feed. No jammed bolts or overheating. + Pas de dysfonctionnement de l'arme : pas de ratés de tir, d'éjection ou d'alimentation. Pas de blocage de la culasse ni de surchauffe. nomal - No recoil. + Pas de recul. norecoil - No sway. + Pas d'oscillation. nosway - No visor, so even when using a face shield-visor you won't see it. + Pas de visière, donc même si vous utilisez un écran facial, vous ne le verrez pas. novisor - Wallhack (you'll see Bear/Boss/Cultist/Scav/Usec with configurable colors through walls). Charms, boxes, info (weapon and health), skeletons and distance. + Wallhack (vous verrez Bear/Boss/Cultist/Scav/Usec avec des couleurs configurables à travers les murs). Silhouettes, boîtes, infos (armes et santé), squelettes et distance. {0} {1}% {2} @@ -549,7 +549,7 @@ Colors are stored as an array of 'RGBA' floats Owner - Locations for taking/placing quest items. Only items related to your started quests are displayed. + Emplacements pour prendre/placer des objets de quête. Seuls les objets liés aux quêtes que vous avez commencées sont affichés. {0} ({1}) @@ -559,55 +559,55 @@ Colors are stored as an array of 'RGBA' floats quest - Quick-throw grenades. + Grenades à lancer rapide. quickthrow - 2D radar. + Radar 2D. radar - [summary] + [sommaire] - Welcome to EFT Trainer ! + Bienvenue à EFT-Trainer ! - All skills to Elite level (51) and all weapons mastering to level 3. + Toutes les compétences au niveau Elite (51) et toutes les armes au niveau 3. skills - Speed boost to be able to go through walls/objects, or to move faster. Be careful to not kill yourself. + Augmentation de la vitesse pour pouvoir passer à travers les murs/objets, ou pour se déplacer plus rapidement. Faites attention à ne pas vous tuer. speed - Unlimited stamina. + Endurance illimitée. stamina - Hidden/special stashes like buried barrels, ground caches, air drops or corpses. + Voir les cachettes comme des barils enterrés, des caches au sol, des parachutages ou des cadavres. stash - Thermal vision. + Vision thermique. thermal - Summon train on compatible maps like Reserve or Lighthouse. + Appeler un train sur des cartes compatibles comme Reserve ou Lighthouse. train @@ -616,13 +616,13 @@ Colors are stored as an array of 'RGBA' floats wallshoot - Clear weather. + Temps dégagé. weather - Door/Keycard reader/Car unlocker. + Déverrouillage de porte/lecteur de carte magnétique/voiture. opener diff --git a/Properties/Strings.resx b/Properties/Strings.resx index 8e373783..983d8734 100644 --- a/Properties/Strings.resx +++ b/Properties/Strings.resx @@ -574,7 +574,7 @@ Colors are stored as an array of 'RGBA' floats [summary] - Welcome to EFT Trainer ! + Welcome to EFT-Trainer ! All skills to Elite level (51) and all weapons mastering to level 3. From fa1cefce253c45722707a0f7885b422beb1c0a9a Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 18:25:45 +0200 Subject: [PATCH 20/21] Consistency --- Properties/Strings.fr.resx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Properties/Strings.fr.resx b/Properties/Strings.fr.resx index 5ea3161e..358e1c8d 100644 --- a/Properties/Strings.fr.resx +++ b/Properties/Strings.fr.resx @@ -781,7 +781,7 @@ Les couleurs sont stockées sous la forme d'un tableau de valeurs flottantes 'RG Chercher les conteneurs - Chercher les corps + Chercher les cadavres Couleurs des cibles @@ -808,7 +808,7 @@ Les couleurs sont stockées sous la forme d'un tableau de valeurs flottantes 'RG Montrer les coordonnées - Montrer les corps + Montrer les cadavres Montrer les Cultistes From 7dac9730a7ce1087e27e4e4de075f42da3c1b718 Mon Sep 17 00:00:00 2001 From: Sebastien Lebreton Date: Mon, 5 Aug 2024 18:27:27 +0200 Subject: [PATCH 21/21] Bump installer version --- Installer/Installer.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Installer/Installer.csproj b/Installer/Installer.csproj index 51320b72..8a382a5a 100644 --- a/Installer/Installer.csproj +++ b/Installer/Installer.csproj @@ -17,7 +17,7 @@ Sebastien Lebreton https://github.com/sailro/EscapeFromTarkov-Trainer - 2.9.0.0 + 3.0.0.0 Sebastien Lebreton