From 2f8f6f7b0d3c4613a251f25f264c368079dbe18d Mon Sep 17 00:00:00 2001 From: Chev <11602755+chev2@users.noreply.github.com> Date: Tue, 13 Apr 2021 00:38:23 -0700 Subject: [PATCH] Artifact of Sequencing --- ArtifactOfSequencing/ArtifactOfSequencing.cs | 151 ++++++++++++++++++ .../ArtifactOfSequencing.csproj | 33 ++-- .../ArtifactOfSequencing.sln | 14 +- .../Properties/Resources.Designer.cs | 83 ++++++++++ .../Properties/Resources.resx | 127 +++++++++++++++ .../texArtifactSequencingDisabled.png | Bin 0 -> 3492 bytes .../texArtifactSequencingEnabled.png | Bin 0 -> 4054 bytes 7 files changed, 391 insertions(+), 17 deletions(-) create mode 100644 ArtifactOfSequencing/ArtifactOfSequencing.cs rename RoR2-SacrificeDropRate/RoR2-SacrificeDropRate/RoR2-SacrificeDropRate.csproj => ArtifactOfSequencing/ArtifactOfSequencing.csproj (79%) rename RoR2-SacrificeDropRate/RoR2-SacrificeDropRate.sln => ArtifactOfSequencing/ArtifactOfSequencing.sln (54%) create mode 100644 ArtifactOfSequencing/Properties/Resources.Designer.cs create mode 100644 ArtifactOfSequencing/Properties/Resources.resx create mode 100644 ArtifactOfSequencing/Properties/texArtifactSequencingDisabled.png create mode 100644 ArtifactOfSequencing/Properties/texArtifactSequencingEnabled.png diff --git a/ArtifactOfSequencing/ArtifactOfSequencing.cs b/ArtifactOfSequencing/ArtifactOfSequencing.cs new file mode 100644 index 0000000..e2dadad --- /dev/null +++ b/ArtifactOfSequencing/ArtifactOfSequencing.cs @@ -0,0 +1,151 @@ +using BepInEx; +using BepInEx.Configuration; +using R2API; +using R2API.Utils; +using RoR2; +using System; +using System.Linq; +using UnityEngine; + +namespace Chev +{ + [BepInDependency("com.bepis.r2api")] + [BepInPlugin("com.Chev.ArtifactOfSequencing", "Artifact of Sequencing", "1.0.0")] + [NetworkCompatibility(CompatibilityLevel.EveryoneMustHaveMod, VersionStrictness.EveryoneNeedSameModVersion)] + [R2APISubmoduleDependency(nameof(ArtifactAPI))] + public class ArtifactOfSequencingMod : BaseUnityPlugin + { + public static ArtifactDef Artifact; + + public static ItemDef CommonItem; + public static ItemDef UncommonItem; + public static ItemDef LegendaryItem; + public static ItemDef BossItem; + public static ItemDef LunarItem; + + private static readonly System.Random _random = new System.Random(); + + public static ConfigEntry CommonItemCount { get; set; } + public static ConfigEntry UncommonItemCount { get; set; } + public static ConfigEntry LegendaryItemCount { get; set; } + public static ConfigEntry BossItemCount { get; set; } + public static ConfigEntry LunarItemCount { get; set; } + + public void Awake() + { + // Initialize config + CommonItemCount = Config.Bind("Quantities", "CommonItemCount", 1, "Quantity of the common (white) item to start with."); + UncommonItemCount = Config.Bind("Quantities", "UncommonItemCount", 1, "Quantity of the uncommon (green) item to start with."); + LegendaryItemCount = Config.Bind("Quantities", "LegendaryItemCount", 1, "Quantity of the legendary (red) item to start with."); + BossItemCount = Config.Bind("Quantities", "BossItemCount", 1, "Quantity of the boss (yellow) item to start with."); + LunarItemCount = Config.Bind("Quantities", "LunarItemCount", 1, "Quantity of the lunar (blue) item to start with."); + + // Initialize the artifact + Artifact = ScriptableObject.CreateInstance(); + + // Artifact info + Artifact.nameToken = "Artifact of Sequencing"; + Artifact.descriptionToken = "Spawn with a single item of every tier. Any picked up items will be converted to the starting item of the same tier."; + Artifact.smallIconSelectedSprite = LoadIcon(ArtifactOfSequencing.Properties.Resources.texArtifactSequencingEnabled); + Artifact.smallIconDeselectedSprite = LoadIcon(ArtifactOfSequencing.Properties.Resources.texArtifactSequencingDisabled); + + // Add our custom artifact to the artifact list + // This uses the ArtifactAPI submodule in R2API + ArtifactAPI.Add(Artifact); + + // On stage start event + // This is when we add our items + //Stage.onStageStartGlobal += AddBeginningItems; + Run.onRunStartGlobal += AddBeginningItems; + + Logger.LogMessage("Loaded mod com.Chev.ArtifactOfSequencing"); + } + + /// + /// Loads a Unity Sprite from resources. + /// + /// The byte array of the resource. + /// + private Sprite LoadIcon(Byte[] resourceBytes) + { + if (resourceBytes == null) + throw new ArgumentNullException(nameof(resourceBytes)); + + Texture2D iconTex = new Texture2D(64, 64, TextureFormat.RGBA32, false); + iconTex.LoadImage(resourceBytes); + + return Sprite.Create(iconTex, new Rect(0f, 0f, iconTex.width, iconTex.height), new Vector2(0.5f, 0.5f)); + } + + /// + /// Gets a random item from a chosen tier. + /// + /// The item tier, e.g. common, uncommon, legendary, lunar, boss + /// + private ItemDef RandomItem(ItemTier tier) + { + ItemDef[] itemDefs = typeof(ItemCatalog).GetFieldValue("itemDefs"); + + ItemDef[] itemsOfTier = itemDefs.Where(item => item.tier == tier).ToArray(); + + return itemsOfTier[_random.Next(0, itemsOfTier.Length)]; + } + + private ItemDef ItemFromTier(ItemTier tier) + { + switch (tier) + { + case ItemTier.Tier1: + return CommonItem; + case ItemTier.Tier2: + return UncommonItem; + case ItemTier.Tier3: + return LegendaryItem; + case ItemTier.Boss: + return BossItem; + case ItemTier.Lunar: + return LunarItem; + default: + return null; + } + } + + public void AddBeginningItems(Run run) + { + CharacterMaster master = PlayerCharacterMasterController.instances[0].master; + + if (master) + { + // Set starting items + CommonItem = RandomItem(ItemTier.Tier1); + UncommonItem = RandomItem(ItemTier.Tier2); + LegendaryItem = RandomItem(ItemTier.Tier3); + BossItem = RandomItem(ItemTier.Boss); + LunarItem = RandomItem(ItemTier.Lunar); + + // Give the starting items + master.inventory.GiveItem(CommonItem, CommonItemCount.Value); + master.inventory.GiveItem(UncommonItem, UncommonItemCount.Value); + master.inventory.GiveItem(LegendaryItem, LegendaryItemCount.Value); + master.inventory.GiveItem(BossItem, BossItemCount.Value); + master.inventory.GiveItem(LunarItem, LunarItemCount.Value); + + // Called every time an item is given + // If the item is not a starter item, remove it and give the starter item + Inventory.onServerItemGiven += (inv, itemIndex, count) => + { + ItemDef starterItemToCompare = ItemFromTier(ItemCatalog.GetItemDef(itemIndex).tier); + + // If they are different items + if (starterItemToCompare != null && starterItemToCompare.itemIndex != itemIndex) + { + int itemCount = inv.GetItemCount(itemIndex); + + inv.RemoveItem(itemIndex, itemCount); + inv.GiveItem(starterItemToCompare, itemCount); + } + }; + } + } + } +} \ No newline at end of file diff --git a/RoR2-SacrificeDropRate/RoR2-SacrificeDropRate/RoR2-SacrificeDropRate.csproj b/ArtifactOfSequencing/ArtifactOfSequencing.csproj similarity index 79% rename from RoR2-SacrificeDropRate/RoR2-SacrificeDropRate/RoR2-SacrificeDropRate.csproj rename to ArtifactOfSequencing/ArtifactOfSequencing.csproj index 5f01a29..e1ae03f 100644 --- a/RoR2-SacrificeDropRate/RoR2-SacrificeDropRate/RoR2-SacrificeDropRate.csproj +++ b/ArtifactOfSequencing/ArtifactOfSequencing.csproj @@ -2,34 +2,29 @@ netstandard2.0 - RoR2_SacrificeDropRate - SacrificeDropRate H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\core\0Harmony.dll + + H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\core\0Harmony20.dll + H:\SteamLibrary\steamapps\common\Risk of Rain 2\Risk of Rain 2_Data\Managed\Assembly-CSharp.dll - - H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\monomod\Assembly-CSharp.R2API.mm.dll - H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\core\BepInEx.dll H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\core\BepInEx.Harmony.dll - - H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\patchers\BepInEx.MonoMod.Loader\BepInEx.MonoMod.Loader.dll - H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\core\BepInEx.Preloader.dll - - H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\plugins\R2API\MMHOOK_Assembly-CSharp.dll + + H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\core\HarmonyXInterop.dll H:\SteamLibrary\steamapps\common\Risk of Rain 2\BepInEx\core\Mono.Cecil.dll @@ -58,9 +53,27 @@ H:\SteamLibrary\steamapps\common\Risk of Rain 2\Risk of Rain 2_Data\Managed\UnityEngine.CoreModule.dll + + H:\SteamLibrary\steamapps\common\Risk of Rain 2\Risk of Rain 2_Data\Managed\UnityEngine.ImageConversionModule.dll + H:\SteamLibrary\steamapps\common\Risk of Rain 2\Risk of Rain 2_Data\Managed\UnityEngine.Networking.dll + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + diff --git a/RoR2-SacrificeDropRate/RoR2-SacrificeDropRate.sln b/ArtifactOfSequencing/ArtifactOfSequencing.sln similarity index 54% rename from RoR2-SacrificeDropRate/RoR2-SacrificeDropRate.sln rename to ArtifactOfSequencing/ArtifactOfSequencing.sln index 3eb9d45..f2d31c2 100644 --- a/RoR2-SacrificeDropRate/RoR2-SacrificeDropRate.sln +++ b/ArtifactOfSequencing/ArtifactOfSequencing.sln @@ -1,9 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 -VisualStudioVersion = 16.0.30204.135 +VisualStudioVersion = 16.0.31005.135 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RoR2-SacrificeDropRate", "RoR2-SacrificeDropRate\RoR2-SacrificeDropRate.csproj", "{85B9C64B-B9FD-474F-89B4-9590529E677F}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArtifactOfSequencing", "ArtifactOfSequencing.csproj", "{F79372C6-A1F3-4F5E-A784-F6C06D2ED0C4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -11,15 +11,15 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {85B9C64B-B9FD-474F-89B4-9590529E677F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85B9C64B-B9FD-474F-89B4-9590529E677F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85B9C64B-B9FD-474F-89B4-9590529E677F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85B9C64B-B9FD-474F-89B4-9590529E677F}.Release|Any CPU.Build.0 = Release|Any CPU + {F79372C6-A1F3-4F5E-A784-F6C06D2ED0C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F79372C6-A1F3-4F5E-A784-F6C06D2ED0C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F79372C6-A1F3-4F5E-A784-F6C06D2ED0C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F79372C6-A1F3-4F5E-A784-F6C06D2ED0C4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {10D54B89-E06E-428E-AE42-911FF165AE02} + SolutionGuid = {1CBC6AD0-C30C-49DF-8722-593A8A0F9DC8} EndGlobalSection EndGlobal diff --git a/ArtifactOfSequencing/Properties/Resources.Designer.cs b/ArtifactOfSequencing/Properties/Resources.Designer.cs new file mode 100644 index 0000000..92773db --- /dev/null +++ b/ArtifactOfSequencing/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// 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 ArtifactOfSequencing.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", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 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("ArtifactOfSequencing.Properties.Resources", typeof(Resources).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 resource of type System.Byte[]. + /// + internal static byte[] texArtifactSequencingDisabled { + get { + object obj = ResourceManager.GetObject("texArtifactSequencingDisabled", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] texArtifactSequencingEnabled { + get { + object obj = ResourceManager.GetObject("texArtifactSequencingEnabled", resourceCulture); + return ((byte[])(obj)); + } + } + } +} diff --git a/ArtifactOfSequencing/Properties/Resources.resx b/ArtifactOfSequencing/Properties/Resources.resx new file mode 100644 index 0000000..a40721e --- /dev/null +++ b/ArtifactOfSequencing/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + texArtifactSequencingDisabled.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + texArtifactSequencingEnabled.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ArtifactOfSequencing/Properties/texArtifactSequencingDisabled.png b/ArtifactOfSequencing/Properties/texArtifactSequencingDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..1a6baaa7151c512b0afcbef793e45feedcb90b1a GIT binary patch literal 3492 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