From a5aabf0e7ac4f904d67c5da2c9bc62af55e33a7d Mon Sep 17 00:00:00 2001 From: Joshua Paul Woods Date: Mon, 10 Jun 2024 22:03:43 +1000 Subject: [PATCH] 2.5.0: Implement spawning of catapult; add console command to spawn mercenaries in with armor; begin preparation for Mac OS X --- ChebsMercenaries/BasePlugin.cs | 10 +- ChebsMercenaries/ChebsMercenaries.csproj | 7 +- ChebsMercenaries/Commands/SpawnMerc.cs | 90 ++++++++++++++++++ ChebsMercenaries/Minions/CatapultMinion.cs | 56 ++++++++++- ChebsMercenaries/Minions/HumanMinion.cs | 42 +------- ChebsMercenaries/Minions/MercenaryMinion.cs | 44 +++++++++ .../Minions/WorkerAI/HumanMinerAI.cs | 2 +- .../Minions/WorkerAI/HumanWoodcutterAI.cs | 2 +- ChebsMercenaries/Package/manifest.json | 2 +- ChebsMercenaries/Patches/TameablePatches.cs | 2 +- ChebsMercenaries/Structure/MercenaryChest.cs | 95 +++++++++++-------- README.md | 1 + .../English/chebsmercenaries.english.json | 3 +- .../German/chebsmercenaries.german.json | 3 +- .../Polish/chebsmercenaries.polish.json | 3 +- .../Russian/chebsmercenaries.russian.json | 3 +- 16 files changed, 268 insertions(+), 97 deletions(-) create mode 100644 ChebsMercenaries/Commands/SpawnMerc.cs diff --git a/ChebsMercenaries/BasePlugin.cs b/ChebsMercenaries/BasePlugin.cs index ee90300..6f42ba2 100644 --- a/ChebsMercenaries/BasePlugin.cs +++ b/ChebsMercenaries/BasePlugin.cs @@ -2,6 +2,7 @@ using System.Security.Cryptography; using BepInEx; using BepInEx.Configuration; +using ChebsMercenaries.Commands; using ChebsMercenaries.Commands.PvP; using ChebsMercenaries.Items; using ChebsMercenaries.Minions; @@ -25,11 +26,11 @@ public class BasePlugin : BaseUnityPlugin { public const string PluginGuid = "com.chebgonaz.chebsmercenaries"; public const string PluginName = "ChebsMercenaries"; - public const string PluginVersion = "2.4.0"; + public const string PluginVersion = "2.5.0"; private const string ConfigFileName = PluginGuid + ".cfg"; private static readonly string ConfigFileFullPath = Path.Combine(Paths.ConfigPath, ConfigFileName); - public readonly System.Version ChebsValheimLibraryVersion = new("2.6.1"); + public readonly System.Version ChebsValheimLibraryVersion = new("2.6.2"); private readonly Harmony harmony = new(PluginGuid); @@ -197,6 +198,8 @@ private void Awake() LoadChebGonazAssetBundle(); harmony.PatchAll(); + // PvP commands could've already been added by Cheb's Necromancy or a different mod, therefore we check + // before adding them. var pvpCommands = new List() { new PvPAddFriend(), new PvPRemoveFriend(), new PvPListFriends() }; foreach (var pvpCommand in pvpCommands) @@ -205,6 +208,9 @@ private void Awake() .ToList().Exists(c => c.Name == pvpCommand.Name)) CommandManager.Instance.AddConsoleCommand(pvpCommand); } + + // No check needed for these because only this mod adds them. + CommandManager.Instance.AddConsoleCommand(new SpawnMerc()); SynchronizationManager.OnConfigurationSynchronized += (obj, attr) => { diff --git a/ChebsMercenaries/ChebsMercenaries.csproj b/ChebsMercenaries/ChebsMercenaries.csproj index dd904b5..73a6bdd 100644 --- a/ChebsMercenaries/ChebsMercenaries.csproj +++ b/ChebsMercenaries/ChebsMercenaries.csproj @@ -20,7 +20,7 @@ $(NeutralLanguage) - 2.4.0.0 + 2.5.0.0 $(Version) $(Version) @@ -36,8 +36,9 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/ChebsMercenaries/Commands/SpawnMerc.cs b/ChebsMercenaries/Commands/SpawnMerc.cs new file mode 100644 index 0000000..a46495f --- /dev/null +++ b/ChebsMercenaries/Commands/SpawnMerc.cs @@ -0,0 +1,90 @@ +using ChebsMercenaries.Minions; +using ChebsValheimLibrary.Minions; +using Jotunn.Entities; +using Jotunn.Managers; + +namespace ChebsMercenaries.Commands +{ + public class SpawnMerc : ConsoleCommand + { + public override string Name => "chebgonaz_spawnmerc"; + + public override string Help => "Requires admin. Spawn a mercenary. Case insensitive.\n" + + $"Usage: {Name} [TYPE={TypesAsString()}] [ARMOR={ArmorsAsString()}]\n" + + $"eg. {Name} WarriorTier1 Bronze"; + + private static string TypesAsString() + { + var values = Enum.GetValues(typeof(MercenaryMinion.MercenaryType)).Cast(); + return string.Join("|", values); + } + + private static string ArmorsAsString() + { + var values = Enum.GetValues(typeof(ChebGonazMinion.ArmorType)).Cast(); + return string.Join("|", values); + } + + private static Dictionary _mercTypeLookup; + private static Dictionary _armorTypeLookup; + + public override void Run(string[] args) + { + if (!SynchronizationManager.Instance.PlayerIsAdmin) + { + Console.instance.Print("Only admins can run this command."); + return; + } + + if (args.Length < 1) + { + Console.instance.Print(Help); + return; + } + + if (_mercTypeLookup == null) + { + _mercTypeLookup = new Dictionary(); + foreach (MercenaryMinion.MercenaryType mercType in Enum.GetValues(typeof(MercenaryMinion.MercenaryType))) + { + var key = mercType.ToString().ToLower(); + _mercTypeLookup.Add(key, mercType); + } + } + + if (_armorTypeLookup == null) + { + _armorTypeLookup = new Dictionary(); + foreach (ChebGonazMinion.ArmorType armorType in Enum.GetValues(typeof(ChebGonazMinion.ArmorType))) + { + var key = armorType.ToString().ToLower(); + _armorTypeLookup.Add(key, armorType); + } + } + + var chosenMerc = MercenaryMinion.MercenaryType.None; + if (!_mercTypeLookup.TryGetValue(args[0].ToLower(), out chosenMerc)) + { + Console.instance.Print($"Invalid type: {args[0]}. Valid options: {TypesAsString()}"); + return; + } + + var chosenArmor = ChebGonazMinion.ArmorType.None; + if (args.Length >= 2) + { + if (!_armorTypeLookup.TryGetValue(args[1].ToLower(), out chosenArmor)) + { + Console.instance.Print($"Invalid armor: {args[1]}. Valid options: {ArmorsAsString()}"); + return; + } + } + + HumanMinion.Spawn(chosenMerc, chosenArmor, Player.m_localPlayer.transform); + } + + public override List CommandOptionList() + { + return ZNetScene.instance?.GetPrefabNames(); + } + } +} diff --git a/ChebsMercenaries/Minions/CatapultMinion.cs b/ChebsMercenaries/Minions/CatapultMinion.cs index 4ff5f1f..80fc8ad 100644 --- a/ChebsMercenaries/Minions/CatapultMinion.cs +++ b/ChebsMercenaries/Minions/CatapultMinion.cs @@ -1,6 +1,10 @@ using BepInEx.Configuration; +using ChebsMercenaries.Structure; using ChebsValheimLibrary.Common; -using Jotunn; +using ChebsValheimLibrary.Minions; +using UnityEngine; +using Logger = Jotunn.Logger; +using Random = System.Random; namespace ChebsMercenaries.Minions { @@ -46,5 +50,55 @@ protected virtual void ConfigureHealth() Logger.LogError("Error: Failed to get Humanoid component to set health value."); } } + + public static void Spawn(Transform spawner) + { + if (ZNetScene.instance == null) + { + Logger.LogWarning("Spawn: ZNetScene.instance is null, trying again later..."); + return; + } + + var prefab = ZNetScene.instance.GetPrefab(PrefabNames[MercenaryType.Catapult]); + if (!prefab) + { + Logger.LogError($"Spawn: spawning catapult failed - can't find prefab"); + return; + } + + var spawnedChar = Instantiate(prefab, + spawner.position + spawner.forward * 2f + Vector3.up, Quaternion.identity); + + if (spawnedChar == null) + { + Logger.LogError("Spawn: spawnedChar is null"); + return; + } + + spawnedChar.AddComponent(); + + if (!spawnedChar.TryGetComponent(out ChebGonazMinion minion)) + { + Logger.LogError("Spawn: spawnedChar has no ChebGonazMinion component"); + return; + } + + minion.Roam(); + + // handle refunding of resources on death + if (DropOnDeath.Value == DropType.Nothing) return; + + var characterDrop = spawnedChar.AddComponent(); + if (DropOnDeath.Value == DropType.Everything) + { + GenerateDeathDrops(characterDrop, ItemsCost); + } + + // the component won't be remembered by the game on logout because + // only what is on the prefab is remembered. Even changes to the prefab + // aren't remembered. So we must write what we're dropping into + // the ZDO as well and then read & restore this on Awake + minion.RecordDrops(characterDrop); + } } } \ No newline at end of file diff --git a/ChebsMercenaries/Minions/HumanMinion.cs b/ChebsMercenaries/Minions/HumanMinion.cs index 40c95bd..b4ef1b6 100644 --- a/ChebsMercenaries/Minions/HumanMinion.cs +++ b/ChebsMercenaries/Minions/HumanMinion.cs @@ -47,47 +47,7 @@ public class HumanMinion : MercenaryMinion return cols; }); } - - public enum MercenaryType - { - None, - WarriorTier1, - WarriorTier2, - WarriorTier3, - WarriorTier4, - ArcherTier1, - ArcherTier2, - ArcherTier3, - Miner, - Woodcutter, - } - - public static readonly Dictionary PrefabNames = new() - { - { MercenaryType.WarriorTier1, "ChebGonaz_HumanWarrior" }, - { MercenaryType.WarriorTier2, "ChebGonaz_HumanWarriorTier2" }, - { MercenaryType.WarriorTier3, "ChebGonaz_HumanWarriorTier3" }, - { MercenaryType.WarriorTier4, "ChebGonaz_HumanWarriorTier4" }, - { MercenaryType.ArcherTier1, "ChebGonaz_HumanArcher" }, - { MercenaryType.ArcherTier2, "ChebGonaz_HumanArcherTier2" }, - { MercenaryType.ArcherTier3, "ChebGonaz_HumanArcherTier3" }, - { MercenaryType.Miner, "ChebGonaz_HumanMiner" }, - { MercenaryType.Woodcutter, "ChebGonaz_HumanWoodcutter" }, - }; - - public static readonly Dictionary PrefabNamesFemale = new() - { - { MercenaryType.WarriorTier1, "ChebGonaz_HumanWarriorFemale" }, - { MercenaryType.WarriorTier2, "ChebGonaz_HumanWarriorTier2Female" }, - { MercenaryType.WarriorTier3, "ChebGonaz_HumanWarriorTier3Female" }, - { MercenaryType.WarriorTier4, "ChebGonaz_HumanWarriorTier4Female" }, - { MercenaryType.ArcherTier1, "ChebGonaz_HumanArcherFemale" }, - { MercenaryType.ArcherTier2, "ChebGonaz_HumanArcherTier2Female" }, - { MercenaryType.ArcherTier3, "ChebGonaz_HumanArcherTier3Female" }, - { MercenaryType.Miner, "ChebGonaz_HumanMinerFemale" }, - { MercenaryType.Woodcutter, "ChebGonaz_HumanWoodcutterFemale" }, - }; - + public sealed override void Awake() { base.Awake(); diff --git a/ChebsMercenaries/Minions/MercenaryMinion.cs b/ChebsMercenaries/Minions/MercenaryMinion.cs index 613faab..2c5b7e2 100644 --- a/ChebsMercenaries/Minions/MercenaryMinion.cs +++ b/ChebsMercenaries/Minions/MercenaryMinion.cs @@ -11,6 +11,50 @@ public class MercenaryMinion : ChebGonazMinion public static ConfigEntry FollowDistance, RunDistance, RoamRange; public static ConfigEntry Health; + + public enum MercenaryType + { + None, + WarriorTier1, + WarriorTier2, + WarriorTier3, + WarriorTier4, + ArcherTier1, + ArcherTier2, + ArcherTier3, + Miner, + Woodcutter, + Catapult, + } + + public static readonly Dictionary PrefabNames = new() + { + { MercenaryType.WarriorTier1, "ChebGonaz_HumanWarrior" }, + { MercenaryType.WarriorTier2, "ChebGonaz_HumanWarriorTier2" }, + { MercenaryType.WarriorTier3, "ChebGonaz_HumanWarriorTier3" }, + { MercenaryType.WarriorTier4, "ChebGonaz_HumanWarriorTier4" }, + { MercenaryType.ArcherTier1, "ChebGonaz_HumanArcher" }, + { MercenaryType.ArcherTier2, "ChebGonaz_HumanArcherTier2" }, + { MercenaryType.ArcherTier3, "ChebGonaz_HumanArcherTier3" }, + { MercenaryType.Miner, "ChebGonaz_HumanMiner" }, + { MercenaryType.Woodcutter, "ChebGonaz_HumanWoodcutter" }, + { MercenaryType.Catapult, "ChebGonaz_Catapult" }, + }; + + public static readonly Dictionary PrefabNamesFemale = new() + { + { MercenaryType.WarriorTier1, "ChebGonaz_HumanWarriorFemale" }, + { MercenaryType.WarriorTier2, "ChebGonaz_HumanWarriorTier2Female" }, + { MercenaryType.WarriorTier3, "ChebGonaz_HumanWarriorTier3Female" }, + { MercenaryType.WarriorTier4, "ChebGonaz_HumanWarriorTier4Female" }, + { MercenaryType.ArcherTier1, "ChebGonaz_HumanArcherFemale" }, + { MercenaryType.ArcherTier2, "ChebGonaz_HumanArcherTier2Female" }, + { MercenaryType.ArcherTier3, "ChebGonaz_HumanArcherTier3Female" }, + { MercenaryType.Miner, "ChebGonaz_HumanMinerFemale" }, + { MercenaryType.Woodcutter, "ChebGonaz_HumanWoodcutterFemale" }, + { MercenaryType.Catapult, "ChebGonaz_Catapult" }, + }; + public static void CreateConfigs(BasePlugin plugin) { diff --git a/ChebsMercenaries/Minions/WorkerAI/HumanMinerAI.cs b/ChebsMercenaries/Minions/WorkerAI/HumanMinerAI.cs index ad1142b..1cac565 100644 --- a/ChebsMercenaries/Minions/WorkerAI/HumanMinerAI.cs +++ b/ChebsMercenaries/Minions/WorkerAI/HumanMinerAI.cs @@ -6,7 +6,7 @@ public class HumanMinerAI : MinerAI { public override float UpdateDelay => HumanMinerMinion.UpdateDelay.Value; public override float LookRadius => HumanMinerMinion.LookRadius.Value; - public override float RoamRange => HumanMinion.RoamRange.Value; + public override float RoamRange => MercenaryMinion.RoamRange.Value; public override string RockInternalIDsList => HumanMinerMinion.RockInternalIDsList.Value; public override float ToolDamage => HumanMinerMinion.ToolDamage.Value; public override short ToolTier => HumanMinerMinion.ToolTier.Value; diff --git a/ChebsMercenaries/Minions/WorkerAI/HumanWoodcutterAI.cs b/ChebsMercenaries/Minions/WorkerAI/HumanWoodcutterAI.cs index 2669e62..03c0ccc 100644 --- a/ChebsMercenaries/Minions/WorkerAI/HumanWoodcutterAI.cs +++ b/ChebsMercenaries/Minions/WorkerAI/HumanWoodcutterAI.cs @@ -6,7 +6,7 @@ public class HumanWoodcutterAI : WoodcutterAI { public override float UpdateDelay => HumanWoodcutterMinion.UpdateDelay.Value; public override float LookRadius => HumanWoodcutterMinion.LookRadius.Value; - public override float RoamRange => HumanMinion.RoamRange.Value; + public override float RoamRange => MercenaryMinion.RoamRange.Value; public override float ToolDamage => HumanWoodcutterMinion.ToolDamage.Value; public override short ToolTier => HumanWoodcutterMinion.ToolTier.Value; public override float ChatInterval => HumanWoodcutterMinion.ChatInterval.Value; diff --git a/ChebsMercenaries/Package/manifest.json b/ChebsMercenaries/Package/manifest.json index 9fa9f6a..0a4b4bd 100644 --- a/ChebsMercenaries/Package/manifest.json +++ b/ChebsMercenaries/Package/manifest.json @@ -1,7 +1,7 @@ { "name": "ChebsMercenaries", "description": "Cheb's Mercenaries adds mercenaries to Valheim that you can purchase with gold and upgrade with materials to fight (warriors, archers) or perform work (lumberjacks, miners).", - "version_number": "2.4.0", + "version_number": "2.5.0", "website_url": "https://github.com/jpw1991/chebs-mercenaries", "dependencies": [ "ValheimModding-Jotunn-2.19.3" diff --git a/ChebsMercenaries/Patches/TameablePatches.cs b/ChebsMercenaries/Patches/TameablePatches.cs index c660816..8a2b481 100644 --- a/ChebsMercenaries/Patches/TameablePatches.cs +++ b/ChebsMercenaries/Patches/TameablePatches.cs @@ -38,7 +38,7 @@ static bool InteractPrefix(Humanoid user, bool hold, bool alt, Tameable __instan return false; // deny base method completion } - if (!HumanMinion.Commandable.Value) + if (!MercenaryMinion.Commandable.Value) { return false; // deny base method completion } diff --git a/ChebsMercenaries/Structure/MercenaryChest.cs b/ChebsMercenaries/Structure/MercenaryChest.cs index 92a57a5..948b467 100644 --- a/ChebsMercenaries/Structure/MercenaryChest.cs +++ b/ChebsMercenaries/Structure/MercenaryChest.cs @@ -37,17 +37,18 @@ public class MercenaryChest : ChebsValheimLibrary.Structures.Structure ObjectName = MethodBase.GetCurrentMethod().DeclaringType.Name }; - private List _orderedByPreference = new() + private List _orderedByPreference = new() { - HumanMinion.MercenaryType.Woodcutter, - HumanMinion.MercenaryType.Miner, - HumanMinion.MercenaryType.ArcherTier3, - HumanMinion.MercenaryType.ArcherTier2, - HumanMinion.MercenaryType.ArcherTier1, - HumanMinion.MercenaryType.WarriorTier4, - HumanMinion.MercenaryType.WarriorTier3, - HumanMinion.MercenaryType.WarriorTier2, - HumanMinion.MercenaryType.WarriorTier1, + MercenaryMinion.MercenaryType.Catapult, + MercenaryMinion.MercenaryType.Woodcutter, + MercenaryMinion.MercenaryType.Miner, + MercenaryMinion.MercenaryType.ArcherTier3, + MercenaryMinion.MercenaryType.ArcherTier2, + MercenaryMinion.MercenaryType.ArcherTier1, + MercenaryMinion.MercenaryType.WarriorTier4, + MercenaryMinion.MercenaryType.WarriorTier3, + MercenaryMinion.MercenaryType.WarriorTier2, + MercenaryMinion.MercenaryType.WarriorTier1, }; public new static void UpdateRecipe() @@ -97,21 +98,22 @@ private void Awake() StartCoroutine(Recruitment()); } - private HumanMinion.MercenaryType NextMercenary() + private MercenaryMinion.MercenaryType NextMercenary() { foreach (var merc in _orderedByPreference) { var itemsCost = merc switch { - HumanMinion.MercenaryType.WarriorTier1 => MercenaryWarriorTier1Minion.ItemsCost, - HumanMinion.MercenaryType.WarriorTier2 => MercenaryWarriorTier2Minion.ItemsCost, - HumanMinion.MercenaryType.WarriorTier3 => MercenaryWarriorTier3Minion.ItemsCost, - HumanMinion.MercenaryType.WarriorTier4 => MercenaryWarriorTier4Minion.ItemsCost, - HumanMinion.MercenaryType.ArcherTier1 => MercenaryArcherTier1Minion.ItemsCost, - HumanMinion.MercenaryType.ArcherTier2 => MercenaryArcherTier2Minion.ItemsCost, - HumanMinion.MercenaryType.ArcherTier3 => MercenaryArcherTier3Minion.ItemsCost, - HumanMinion.MercenaryType.Miner => HumanMinerMinion.ItemsCost, - HumanMinion.MercenaryType.Woodcutter => HumanWoodcutterMinion.ItemsCost, + MercenaryMinion.MercenaryType.Catapult => CatapultMinion.ItemsCost, + MercenaryMinion.MercenaryType.WarriorTier1 => MercenaryWarriorTier1Minion.ItemsCost, + MercenaryMinion.MercenaryType.WarriorTier2 => MercenaryWarriorTier2Minion.ItemsCost, + MercenaryMinion.MercenaryType.WarriorTier3 => MercenaryWarriorTier3Minion.ItemsCost, + MercenaryMinion.MercenaryType.WarriorTier4 => MercenaryWarriorTier4Minion.ItemsCost, + MercenaryMinion.MercenaryType.ArcherTier1 => MercenaryArcherTier1Minion.ItemsCost, + MercenaryMinion.MercenaryType.ArcherTier2 => MercenaryArcherTier2Minion.ItemsCost, + MercenaryMinion.MercenaryType.ArcherTier3 => MercenaryArcherTier3Minion.ItemsCost, + MercenaryMinion.MercenaryType.Miner => HumanMinerMinion.ItemsCost, + MercenaryMinion.MercenaryType.Woodcutter => HumanWoodcutterMinion.ItemsCost, _ => null }; @@ -119,22 +121,23 @@ private HumanMinion.MercenaryType NextMercenary() return merc; } - return HumanMinion.MercenaryType.None; + return MercenaryMinion.MercenaryType.None; } - private void PayForMercenary(HumanMinion.MercenaryType mercenaryType) + private void PayForMercenary(MercenaryMinion.MercenaryType mercenaryType) { var itemsCost = mercenaryType switch { - HumanMinion.MercenaryType.WarriorTier1 => MercenaryWarriorTier1Minion.ItemsCost, - HumanMinion.MercenaryType.WarriorTier2 => MercenaryWarriorTier2Minion.ItemsCost, - HumanMinion.MercenaryType.WarriorTier3 => MercenaryWarriorTier3Minion.ItemsCost, - HumanMinion.MercenaryType.WarriorTier4 => MercenaryWarriorTier4Minion.ItemsCost, - HumanMinion.MercenaryType.ArcherTier1 => MercenaryArcherTier1Minion.ItemsCost, - HumanMinion.MercenaryType.ArcherTier2 => MercenaryArcherTier2Minion.ItemsCost, - HumanMinion.MercenaryType.ArcherTier3 => MercenaryArcherTier3Minion.ItemsCost, - HumanMinion.MercenaryType.Miner => HumanMinerMinion.ItemsCost, - HumanMinion.MercenaryType.Woodcutter => HumanWoodcutterMinion.ItemsCost, + MercenaryMinion.MercenaryType.Catapult => CatapultMinion.ItemsCost, + MercenaryMinion.MercenaryType.WarriorTier1 => MercenaryWarriorTier1Minion.ItemsCost, + MercenaryMinion.MercenaryType.WarriorTier2 => MercenaryWarriorTier2Minion.ItemsCost, + MercenaryMinion.MercenaryType.WarriorTier3 => MercenaryWarriorTier3Minion.ItemsCost, + MercenaryMinion.MercenaryType.WarriorTier4 => MercenaryWarriorTier4Minion.ItemsCost, + MercenaryMinion.MercenaryType.ArcherTier1 => MercenaryArcherTier1Minion.ItemsCost, + MercenaryMinion.MercenaryType.ArcherTier2 => MercenaryArcherTier2Minion.ItemsCost, + MercenaryMinion.MercenaryType.ArcherTier3 => MercenaryArcherTier3Minion.ItemsCost, + MercenaryMinion.MercenaryType.Miner => HumanMinerMinion.ItemsCost, + MercenaryMinion.MercenaryType.Woodcutter => HumanWoodcutterMinion.ItemsCost, _ => null }; if (BasePlugin.HeavyLogging.Value) @@ -243,15 +246,16 @@ IEnumerator Recruitment() { var nextMercLocalized = nextMerc switch { - HumanMinion.MercenaryType.WarriorTier1 => Localization.instance.Localize("$chebgonaz_mercenarytype_warriortier1"), - HumanMinion.MercenaryType.WarriorTier2 => Localization.instance.Localize("$chebgonaz_mercenarytype_warriortier2"), - HumanMinion.MercenaryType.WarriorTier3 => Localization.instance.Localize("$chebgonaz_mercenarytype_warriortier3"), - HumanMinion.MercenaryType.WarriorTier4 => Localization.instance.Localize("$chebgonaz_mercenarytype_warriortier4"), - HumanMinion.MercenaryType.ArcherTier1 => Localization.instance.Localize("$chebgonaz_mercenarytype_archertier1"), - HumanMinion.MercenaryType.ArcherTier2 => Localization.instance.Localize("$chebgonaz_mercenarytype_archertier2"), - HumanMinion.MercenaryType.ArcherTier3 => Localization.instance.Localize("$chebgonaz_mercenarytype_archertier3"), - HumanMinion.MercenaryType.Miner => Localization.instance.Localize("$chebgonaz_mercenarytype_miner"), - HumanMinion.MercenaryType.Woodcutter => Localization.instance.Localize("$chebgonaz_mercenarytype_woodcutter"), + MercenaryMinion.MercenaryType.Catapult => Localization.instance.Localize("$chebgonaz_mercenarytype_catapult"), + MercenaryMinion.MercenaryType.WarriorTier1 => Localization.instance.Localize("$chebgonaz_mercenarytype_warriortier1"), + MercenaryMinion.MercenaryType.WarriorTier2 => Localization.instance.Localize("$chebgonaz_mercenarytype_warriortier2"), + MercenaryMinion.MercenaryType.WarriorTier3 => Localization.instance.Localize("$chebgonaz_mercenarytype_warriortier3"), + MercenaryMinion.MercenaryType.WarriorTier4 => Localization.instance.Localize("$chebgonaz_mercenarytype_warriortier4"), + MercenaryMinion.MercenaryType.ArcherTier1 => Localization.instance.Localize("$chebgonaz_mercenarytype_archertier1"), + MercenaryMinion.MercenaryType.ArcherTier2 => Localization.instance.Localize("$chebgonaz_mercenarytype_archertier2"), + MercenaryMinion.MercenaryType.ArcherTier3 => Localization.instance.Localize("$chebgonaz_mercenarytype_archertier3"), + MercenaryMinion.MercenaryType.Miner => Localization.instance.Localize("$chebgonaz_mercenarytype_miner"), + MercenaryMinion.MercenaryType.Woodcutter => Localization.instance.Localize("$chebgonaz_mercenarytype_woodcutter"), _ => Localization.instance.Localize("$chebgonaz_mercenarytype_none") }; var recruitmentMessage = @@ -267,10 +271,17 @@ IEnumerator Recruitment() if (Time.time - _lastRecruitmentAt > RecruitmentInterval.Value) { _lastRecruitmentAt = Time.time; - if (nextMerc != HumanMinion.MercenaryType.None) + if (nextMerc != MercenaryMinion.MercenaryType.None) { PayForMercenary(nextMerc); - HumanMinion.Spawn(nextMerc, UpgradeMercenaryEquipment(), transform); + if (nextMerc == MercenaryMinion.MercenaryType.Catapult) + { + CatapultMinion.Spawn(transform); + } + else + { + HumanMinion.Spawn(nextMerc, UpgradeMercenaryEquipment(), transform); + } } } } diff --git a/README.md b/README.md index 7abaa2b..fa7cb61 100644 --- a/README.md +++ b/README.md @@ -147,6 +147,7 @@ You can find the github [here](https://github.com/jpw1991/chebs-mercenaries). Date | Version | Notes --- | --- | --- +10/06/2024 | 2.5.0 | 06/02/2024 | 2.4.0 | Add catapult 07/01/2024 | 2.3.0 | PvP with friends as exceptions implemented via console commands. diff --git a/Translations/English/chebsmercenaries.english.json b/Translations/English/chebsmercenaries.english.json index 68bfb78..15b2b10 100644 --- a/Translations/English/chebsmercenaries.english.json +++ b/Translations/English/chebsmercenaries.english.json @@ -34,5 +34,6 @@ "$chebgonaz_worker_cantfindtarget": "Can't find target.", "$chebgonaz_minionstatus_following": "Following", "$chebgonaz_minionstatus_roaming": "Roaming", - "$chebgonaz_minionstatus_waiting": "Waiting" + "$chebgonaz_minionstatus_waiting": "Waiting", + "$chebgonaz_mercenarytype_catapult": "Catapult", } \ No newline at end of file diff --git a/Translations/German/chebsmercenaries.german.json b/Translations/German/chebsmercenaries.german.json index 1a89c01..5c153e8 100644 --- a/Translations/German/chebsmercenaries.german.json +++ b/Translations/German/chebsmercenaries.german.json @@ -18,5 +18,6 @@ "$chebsmercenaries_weaponofcommand_follow": "Follow", "$chebsmercenaries_weaponofcommand_wait": "Wait", "$chebsmercenaries_weaponofcommand_teleport": "Teleport", - "$chebsmercenaries_weaponofcommand_shift": "Shift" + "$chebsmercenaries_weaponofcommand_shift": "Shift", + "$chebgonaz_mercenarytype_catapult": "Catapult", } \ No newline at end of file diff --git a/Translations/Polish/chebsmercenaries.polish.json b/Translations/Polish/chebsmercenaries.polish.json index 5a7d088..fc4a27e 100644 --- a/Translations/Polish/chebsmercenaries.polish.json +++ b/Translations/Polish/chebsmercenaries.polish.json @@ -18,5 +18,6 @@ "$chebsmercenaries_weaponofcommand_follow": "Follow", "$chebsmercenaries_weaponofcommand_wait": "Wait", "$chebsmercenaries_weaponofcommand_teleport": "Teleport", - "$chebsmercenaries_weaponofcommand_shift": "Shift" + "$chebsmercenaries_weaponofcommand_shift": "Shift", + "$chebgonaz_mercenarytype_catapult": "Catapult", } \ No newline at end of file diff --git a/Translations/Russian/chebsmercenaries.russian.json b/Translations/Russian/chebsmercenaries.russian.json index 7a20bf2..de0aba5 100644 --- a/Translations/Russian/chebsmercenaries.russian.json +++ b/Translations/Russian/chebsmercenaries.russian.json @@ -34,5 +34,6 @@ "$chebgonaz_worker_cantfindtarget": "Не могу найти цель.", "$chebgonaz_minionstatus_following": "Следует", "$chebgonaz_minionstatus_waiting": "Ждет", - "$chebgonaz_minionstatus_roaming": "Гуляет" + "$chebgonaz_minionstatus_roaming": "Гуляет", + "$chebgonaz_mercenarytype_catapult": "Catapult", } \ No newline at end of file