Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of GuardiansDoorbreaker v1.0.1
DoorbreakerPlugin.dll
Decompiled 12 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using Microsoft.CodeAnalysis; using On.RoR2; using R2API; using R2API.Utils; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("DoorbreakerPlugin.cs")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("DoorbreakerPlugin.cs")] [assembly: AssemblyTitle("DoorbreakerPlugin.cs")] [assembly: AssemblyVersion("1.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace GuardiansDoorbreaker { [BepInPlugin("com.rahziva.guardiansdoorbreaker", "Guardian's Doorbreaker", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class DoorbreakerPlugin : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_SetItemDefs <>9__11_0; public static StatHookEventHandler <>9__13_0; internal void <InitializeItemAndBuff>b__11_0(orig_SetItemDefs orig, ItemDef[] newItemDefs) { foreach (ItemDef val in newItemDefs) { if (((Object)val).name == "GuardiansDoorbreaker") { val.tier = (ItemTier)1; } } orig.Invoke(newItemDefs); } internal void <HookMechanics>b__13_0(CharacterBody sender, StatHookEventArgs args) { if (!((Object)(object)sender.inventory != (Object)null)) { return; } int itemCount = sender.inventory.GetItemCount(GuardianDoorbreakerItem); if (itemCount > 0) { int buffCount = sender.GetBuffCount(DamageStackBuff); if (buffCount > 0) { float num = BaseDamagePerStack.Value + StackDamageScaling.Value * (float)(itemCount - 1); float num2 = (float)buffCount * num; args.baseDamageAdd += num2; } } } } private Dictionary<CharacterMaster, int> killStacks = new Dictionary<CharacterMaster, int>(); private Dictionary<CharacterMaster, int> totalKills = new Dictionary<CharacterMaster, int>(); public static ItemDef GuardianDoorbreakerItem; public static BuffDef DamageStackBuff; public static ConfigEntry<float> BaseTriggerChance; public static ConfigEntry<int> KillsForChanceIncrease; public static ConfigEntry<float> ChanceIncreaseAmount; public static ConfigEntry<float> BaseDamagePerStack; public static ConfigEntry<float> StackDamageScaling; public void Awake() { InitializeConfig(); InitializeItemAndBuff(); LoadAssetBundle(); SetupLocalization(); HookMechanics(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Guardian's Doorbreaker v1.0.0 initialized successfully."); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private void InitializeConfig() { //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Expected O, but got Unknown //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Expected O, but got Unknown //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Expected O, but got Unknown //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Expected O, but got Unknown //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Expected O, but got Unknown //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Expected O, but got Unknown //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Expected O, but got Unknown //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Expected O, but got Unknown //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Expected O, but got Unknown BaseTriggerChance = ((BaseUnityPlugin)this).Config.Bind<float>("Balance", "Base Trigger Chance", 0.2f, "Base chance to trigger on kill (0.20 = 20%)"); KillsForChanceIncrease = ((BaseUnityPlugin)this).Config.Bind<int>("Balance", "Kills For Chance Increase", 25, "Kills required to increase trigger chance"); ChanceIncreaseAmount = ((BaseUnityPlugin)this).Config.Bind<float>("Balance", "Chance Increase Amount", 0.01f, "Amount of chance gained per required kills (0.01 = 1%)"); BaseDamagePerStack = ((BaseUnityPlugin)this).Config.Bind<float>("Balance", "Base Damage Per Stack", 0.25f, "Base damage gained per stack"); StackDamageScaling = ((BaseUnityPlugin)this).Config.Bind<float>("Balance", "Stack Damage Scaling", 0.05f, "Extra damage scaling per additional item in inventory"); if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions")) { ModSettingsManager.SetModDescription("Settings for Guardian's Doorbreaker."); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(BaseTriggerChance, new StepSliderConfig { min = 0f, max = 1f, increment = 0.01f })); ModSettingsManager.AddOption((BaseOption)new IntSliderOption(KillsForChanceIncrease, new IntSliderConfig { min = 1, max = 100 })); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(ChanceIncreaseAmount, new StepSliderConfig { min = 0f, max = 1f, increment = 0.01f })); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(BaseDamagePerStack, new StepSliderConfig { min = 0f, max = 5f, increment = 0.05f })); ModSettingsManager.AddOption((BaseOption)new StepSliderOption(StackDamageScaling, new StepSliderConfig { min = 0f, max = 2f, increment = 0.01f })); } } private void InitializeItemAndBuff() { //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Expected O, but got Unknown //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Expected O, but got Unknown GuardianDoorbreakerItem = ScriptableObject.CreateInstance<ItemDef>(); ((Object)GuardianDoorbreakerItem).name = "GuardiansDoorbreaker"; GuardianDoorbreakerItem.nameToken = "ITEM_KORUYUCU_NAME"; GuardianDoorbreakerItem.pickupToken = "ITEM_KORUYUCU_PICKUP"; GuardianDoorbreakerItem.descriptionToken = "ITEM_KORUYUCU_DESC"; GuardianDoorbreakerItem.loreToken = "ITEM_KORUYUCU_LORE"; GuardianDoorbreakerItem.tier = (ItemTier)1; GuardianDoorbreakerItem.tags = (ItemTag[])(object)new ItemTag[1] { (ItemTag)1 }; GuardianDoorbreakerItem.canRemove = true; GuardianDoorbreakerItem.hidden = false; DamageStackBuff = ScriptableObject.CreateInstance<BuffDef>(); ((Object)DamageStackBuff).name = "DoorbreakerStackBuff"; DamageStackBuff.buffColor = Color.white; DamageStackBuff.canStack = true; DamageStackBuff.isDebuff = false; DamageStackBuff.isHidden = false; string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); string path = Path.Combine(directoryName, "icon.png"); if (File.Exists(path)) { byte[] array = File.ReadAllBytes(path); Texture2D val = new Texture2D(2, 2); ImageConversion.LoadImage(val, array); Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); GuardianDoorbreakerItem.pickupIconSprite = val2; DamageStackBuff.iconSprite = val2; } ContentAddition.AddBuffDef(DamageStackBuff); object obj = <>c.<>9__11_0; if (obj == null) { hook_SetItemDefs val3 = delegate(orig_SetItemDefs orig, ItemDef[] newItemDefs) { foreach (ItemDef val4 in newItemDefs) { if (((Object)val4).name == "GuardiansDoorbreaker") { val4.tier = (ItemTier)1; } } orig.Invoke(newItemDefs); }; <>c.<>9__11_0 = val3; obj = (object)val3; } ItemCatalog.SetItemDefs += (hook_SetItemDefs)obj; } private void LoadAssetBundle() { //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Unknown result type (might be due to invalid IL or missing references) //IL_03b4: Unknown result type (might be due to invalid IL or missing references) //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_03cf: Unknown result type (might be due to invalid IL or missing references) //IL_03e5: Unknown result type (might be due to invalid IL or missing references) //IL_03ea: Unknown result type (might be due to invalid IL or missing references) //IL_03ef: Unknown result type (might be due to invalid IL or missing references) //IL_03f1: Unknown result type (might be due to invalid IL or missing references) //IL_03f6: Unknown result type (might be due to invalid IL or missing references) //IL_03fc: Expected O, but got Unknown //IL_0402: Unknown result type (might be due to invalid IL or missing references) //IL_040c: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Expected O, but got Unknown //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Expected O, but got Unknown //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) string name = "SonsuzStack.kapikoruyucusununbaltasi"; string[] manifestResourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames(); foreach (string text in manifestResourceNames) { if (text.EndsWith("kapikoruyucusununbaltasi")) { name = text; } } using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name)) { if (stream != null) { AssetBundle val = AssetBundle.LoadFromStream(stream); GameObject val2 = val.LoadAsset<GameObject>("AsilKutu"); if ((Object)(object)val2 == (Object)null) { GameObject[] array = val.LoadAllAssets<GameObject>(); if (array.Length != 0) { val2 = array[0]; } } if ((Object)(object)val2 != (Object)null) { val2.transform.position = Vector3.zero; val2.transform.rotation = Quaternion.identity; val2.transform.localScale = Vector3.one; Shader val3 = Addressables.LoadAssetAsync<Shader>((object)"RoR2/Base/Shaders/HGStandard.shader").WaitForCompletion(); Renderer[] componentsInChildren = val2.GetComponentsInChildren<Renderer>(true); foreach (Renderer val4 in componentsInChildren) { ((Component)val4).gameObject.layer = 0; ((Component)val4).transform.localPosition = Vector3.zero; ((Component)val4).transform.localRotation = Quaternion.Euler(-90f, 90f, 0f); ((Component)val4).transform.localScale = Vector3.one; if ((Object)(object)val3 != (Object)null && (Object)(object)val4.sharedMaterial != (Object)null) { Texture mainTexture = val4.sharedMaterial.mainTexture; val4.sharedMaterial.shader = val3; val4.sharedMaterial.mainTexture = mainTexture; val4.sharedMaterial.color = Color.white; } } Transform val5 = val2.transform.Find("FocusPoint"); if ((Object)(object)val5 == (Object)null) { GameObject val6 = new GameObject("FocusPoint"); val6.transform.SetParent(val2.transform, false); val6.transform.localPosition = Vector3.zero; val5 = val6.transform; } Transform val7 = val2.transform.Find("CameraPosition"); if ((Object)(object)val7 == (Object)null) { GameObject val8 = new GameObject("CameraPosition"); val8.transform.SetParent(val2.transform, false); val8.transform.localPosition = new Vector3(0f, 0f, -5f); val7 = val8.transform; } ModelPanelParameters val9 = val2.GetComponent<ModelPanelParameters>(); if ((Object)(object)val9 == (Object)null) { val9 = val2.AddComponent<ModelPanelParameters>(); } val9.focusPointTransform = val5; val9.cameraPositionTransform = val7; val9.minDistance = 1.5f; val9.maxDistance = 8f; GuardianDoorbreakerItem.pickupModelPrefab = val2; } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Custom prefab could not be loaded from AssetBundle."); GuardianDoorbreakerItem.pickupModelPrefab = Resources.Load<GameObject>("Prefabs/PickupModels/PickupMystery"); } val.Unload(false); } else { ((BaseUnityPlugin)this).Logger.LogError((object)"AssetBundle stream is null. Ensure Build Action is set to Embedded Resource."); GuardianDoorbreakerItem.pickupModelPrefab = Resources.Load<GameObject>("Prefabs/PickupModels/PickupMystery"); } } ItemDisplayRuleDict val10 = new ItemDisplayRuleDict((ItemDisplayRule[])(object)new ItemDisplayRule[1] { new ItemDisplayRule { ruleType = (ItemDisplayRuleType)0, followerPrefab = GuardianDoorbreakerItem.pickupModelPrefab, childName = "Chest", localPos = new Vector3(-0.09358f, 0.24727f, -0.25762f), localAngles = new Vector3(358.6058f, 86.05035f, 8.78745f), localScale = new Vector3(0.09f, 0.09f, 0.09f) } }); ItemAPI.Add(new CustomItem(GuardianDoorbreakerItem, val10)); } private void HookMechanics() { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected O, but got Unknown //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown object obj = <>c.<>9__13_0; if (obj == null) { StatHookEventHandler val = delegate(CharacterBody sender, StatHookEventArgs args) { if ((Object)(object)sender.inventory != (Object)null) { int itemCount = sender.inventory.GetItemCount(GuardianDoorbreakerItem); if (itemCount > 0) { int buffCount = sender.GetBuffCount(DamageStackBuff); if (buffCount > 0) { float num = BaseDamagePerStack.Value + StackDamageScaling.Value * (float)(itemCount - 1); float num2 = (float)buffCount * num; args.baseDamageAdd += num2; } } } }; <>c.<>9__13_0 = val; obj = (object)val; } RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj; CharacterBody.Start += (hook_Start)delegate(orig_Start orig, CharacterBody self) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (NetworkServer.active && Object.op_Implicit((Object)(object)self.master) && Object.op_Implicit((Object)(object)self.inventory) && killStacks.ContainsKey(self.master) && self.inventory.GetItemCount(GuardianDoorbreakerItem) > 0) { self.SetBuffCount(DamageStackBuff.buffIndex, killStacks[self.master]); } }; GlobalEventManager.OnCharacterDeath += (hook_OnCharacterDeath)delegate(orig_OnCharacterDeath orig, GlobalEventManager self, DamageReport damageReport) { //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Expected O, but got Unknown orig.Invoke(self, damageReport); if (NetworkServer.active && !((Object)(object)damageReport.attackerBody == (Object)null) && damageReport.attackerBody.isPlayerControlled) { CharacterMaster master = damageReport.attackerBody.master; if (!((Object)(object)master == (Object)null)) { int itemCount = master.inventory.GetItemCount(GuardianDoorbreakerItem); if (itemCount > 0) { if (!totalKills.ContainsKey(master)) { totalKills[master] = 0; } totalKills[master]++; float num = (float)(totalKills[master] / KillsForChanceIncrease.Value) * ChanceIncreaseAmount.Value; float num2 = BaseTriggerChance.Value + num; if (Random.value <= num2) { if (!killStacks.ContainsKey(master)) { killStacks[master] = 0; } killStacks[master]++; damageReport.attackerBody.SetBuffCount(DamageStackBuff.buffIndex, killStacks[master]); GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/OmniImpactVFX.prefab").WaitForCompletion(); if ((Object)(object)val2 != (Object)null) { EffectManager.SpawnEffect(val2, new EffectData { origin = damageReport.attackerBody.corePosition, scale = 1.5f }, true); } } } } } }; } private void SetupLocalization() { LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Guardian's Doorbreaker", "en"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"Killing enemies has a {BaseTriggerChance.Value * 100f}% chance to permanently grant {BaseDamagePerStack.Value} base damage.", "en"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"Killing enemies has a <style=cIsUtility>{BaseTriggerChance.Value * 100f}% chance</style> <style=cStack>(+{ChanceIncreaseAmount.Value * 100f}% per {KillsForChanceIncrease.Value} kills)</style> to permanently grant <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} per item)</style> base damage.", "en"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "A legend forgotten amidst the sands of time...\n\nAn ancient guardian once said: \"Life and death are a cycle. We live, they die.\"\n\nIt is said that this heavy weapon grows denser with every soul reaped, its strikes reaching earth-shattering power. Now, the relic of that endless harvest awakens in the hands of a new pilot.", "en"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Koruyucu'nun Kapı Kırıcısı", "tr"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"Düşman öldürmek %{BaseTriggerChance.Value * 100f} şansla kalıcı olarak {BaseDamagePerStack.Value} temel hasar kazandırır.", "tr"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"Düşman öldürmek <style=cIsUtility>%{BaseTriggerChance.Value * 100f} şansla</style> <style=cStack>(Her {KillsForChanceIncrease.Value} leşte +%{ChanceIncreaseAmount.Value * 100f})</style> kalıcı olarak <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} eşya başına)</style> temel hasar kazandırır.", "tr"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "Zamanın kumları arasında unutulmuş bir efsane...\n\nKadim bir muhafız şöyle derdi: \"Yaşam ve ölüm bir döngüdür. Biz yaşarız, onlar ölür.\"\n\nBu ağır silahın her ruhu biçtiğinde biraz daha ağırlaştığı ve vuruşlarının dünyayı sarsacak güce ulaştığı söylenir. Şimdi o sonsuz ruh hasadının yadigarı, yeni bir pilotun ellerinde uyanıyor.", "tr"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Brise-porte du Gardien", "fr"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"Tuer des ennemis a {BaseTriggerChance.Value * 100f} % de chances d'octroyer définitivement {BaseDamagePerStack.Value} dégâts de base.", "fr"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"Tuer des ennemis a <style=cIsUtility>{BaseTriggerChance.Value * 100f} % de chances</style> <style=cStack>(+{ChanceIncreaseAmount.Value * 100f} % toutes les {KillsForChanceIncrease.Value} éliminations)</style> d'octroyer définitivement <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} par objet)</style> dégâts de base.", "fr"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "Une légende oubliée dans les sables du temps...\n\nUn ancien gardien disait : \"La vie et la mort sont un cycle. Nous vivons, ils meurent.\"\n\nOn dit que cette arme lourde devient plus dense à chaque âme fauchée, ses frappes atteignant une puissance fulgurante. Aujourd'hui, la relique de cette moisson sans fin s'éveille entre les mains d'un nouveau pilote.", "fr"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Türbrecher des Wächters", "de"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"Das Töten von Feinden gewährt mit einer Wahrscheinlichkeit von {BaseTriggerChance.Value * 100f}% dauerhaft {BaseDamagePerStack.Value} Grundschaden.", "de"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"Das Töten von Feinden gewährt mit einer Wahrscheinlichkeit von <style=cIsUtility>{BaseTriggerChance.Value * 100f}%</style> <style=cStack>(+{ChanceIncreaseAmount.Value * 100f}% alle {KillsForChanceIncrease.Value} Kills)</style> dauerhaft <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} pro Gegenstand)</style> Grundschaden.", "de"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "Eine im Sand der Zeit vergessene Legende...\n\nEin alter Wächter sagte einst: \"Leben und Tod sind ein Kreislauf. Wir leben, sie sterben.\"\n\nEs heißt, diese schwere Waffe wird mit jeder geernteten Seele dichter und ihre Schläge erreichen welterschütternde Kraft. Nun erwacht das Relikt dieser endlosen Ernte in den Händen eines neuen Piloten.", "de"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Rompepuertas del Guardián", "es"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"Matar enemigos tiene un {BaseTriggerChance.Value * 100f}% de probabilidad de otorgar permanentemente {BaseDamagePerStack.Value} de daño base.", "es"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"Matar enemigos tiene un <style=cIsUtility>{BaseTriggerChance.Value * 100f}% de probabilidad</style> <style=cStack>(+{ChanceIncreaseAmount.Value * 100f}% cada {KillsForChanceIncrease.Value} bajas)</style> de otorgar permanentemente <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} por objeto)</style> de daño base.", "es"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "Una leyenda olvidada en las arenas del tiempo...\n\nUn antiguo guardián dijo una vez: \"La vida y la muerte son un ciclo. Nosotros vivimos, ellos mueren.\"\n\nSe dice que esta pesada arma se vuelve más densa con cada alma cosechada, alcanzando sus golpes un poder devastador. Ahora, la reliquia de esta cosecha interminable despierta en las manos de un nuevo piloto.", "es"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Rompepuertas del Guardián", "es-419"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"Matar enemigos tiene un {BaseTriggerChance.Value * 100f}% de probabilidad de otorgar permanentemente {BaseDamagePerStack.Value} de daño base.", "es-419"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"Matar enemigos tiene un <style=cIsUtility>{BaseTriggerChance.Value * 100f}% de probabilidad</style> <style=cStack>(+{ChanceIncreaseAmount.Value * 100f}% cada {KillsForChanceIncrease.Value} bajas)</style> de otorgar permanentemente <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} por objeto)</style> de daño base.", "es-419"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "Una leyenda olvidada en las arenas del tiempo...\n\nUn antiguo guardián dijo una vez: \"La vida y la muerte son un ciclo. Nosotros vivimos, ellos mueren.\"\n\nSe dice que esta pesada arma se vuelve más densa con cada alma cosechada, alcanzando sus golpes un poder devastador. Ahora, la reliquia de esta cosecha interminable despierta en las manos de un nuevo piloto.", "es-419"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Sfondaporte del Guardiano", "it"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"Uccidere i nemici ha una probabilità del {BaseTriggerChance.Value * 100f}% di conferire permanentemente {BaseDamagePerStack.Value} danni base.", "it"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"Uccidere i nemici ha una <style=cIsUtility>probabilità del {BaseTriggerChance.Value * 100f}%</style> <style=cStack>(+{ChanceIncreaseAmount.Value * 100f}% ogni {KillsForChanceIncrease.Value} uccisioni)</style> di conferire permanentemente <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} per oggetto)</style> danni base.", "it"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "Una leggenda dimenticata tra le sabbie del tempo...\n\nUn antico guardiano disse: \"La vita e la morte sono un ciclo. Noi viviamo, loro muoiono.\"\n\nSi dice che quest'arma pesante diventi più densa con ogni anima mietuta e che i suoi colpi raggiungano un potere devastante. Ora, la reliquia di quel raccolto infinito si risveglia nelle mani di un nuovo pilota.", "it"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Quebra-portas do Guardião", "pt-BR"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"Matar inimigos tem {BaseTriggerChance.Value * 100f}% de chance de conceder permanentemente {BaseDamagePerStack.Value} de dano base.", "pt-BR"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"Matar inimigos tem <style=cIsUtility>{BaseTriggerChance.Value * 100f}% de chance</style> <style=cStack>(+{ChanceIncreaseAmount.Value * 100f}% a cada {KillsForChanceIncrease.Value} abates)</style> de conceder permanentemente <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} por item)</style> de dano base.", "pt-BR"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "Uma lenda esquecida nas areias do tempo...\n\nUm antigo guardião disse uma vez: \"A vida e a morte são um ciclo. Nós vivemos, eles morrem.\"\n\nDiz-se que esta arma pesada fica mais densa a cada alma ceifada, seus golpes alcançando um poder de abalar a terra. Agora, a relíquia dessa colheita sem fim desperta nas mãos de um novo piloto.", "pt-BR"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "Взломщик Врат Стража", "ru"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"При убийстве врагов есть {BaseTriggerChance.Value * 100f}% шанс навсегда получить {BaseDamagePerStack.Value} базового урона.", "ru"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"При убийстве врагов есть <style=cIsUtility>{BaseTriggerChance.Value * 100f}% шанс</style> <style=cStack>(+{ChanceIncreaseAmount.Value * 100f}% за каждые {KillsForChanceIncrease.Value} убийств)</style> навсегда получить <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(+{StackDamageScaling.Value} за предмет)</style> базового урона.", "ru"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "Легенда, забытая в песках времени...\n\nДревний страж однажды сказал: \"Жизнь и смерть - это цикл. Мы живем, они умирают.\"\n\nГоворят, что это тяжелое оружие становится плотнее с каждой пожатой душой, а его удары достигают сокрушительной силы. Теперь реликвия этой бесконечной жатвы пробуждается в руках нового пилота.", "ru"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "守护者的破门斧", "zh-CN"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"击杀敌人有 {BaseTriggerChance.Value * 100f}% 的几率永久增加 {BaseDamagePerStack.Value} 基础伤害。", "zh-CN"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"击杀敌人有 <style=cIsUtility>{BaseTriggerChance.Value * 100f}% 的几率</style> <style=cStack>(每 {KillsForChanceIncrease.Value} 击杀 +{ChanceIncreaseAmount.Value * 100f}%)</style> 永久增加 <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(每件物品 +{StackDamageScaling.Value})</style> 基础伤害。", "zh-CN"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "被遗忘在时间长河中的传说……\n\n一位古老的守护者曾说过:“生与死是一个循环。我们生,他们死。”\n\n据说这把重武器每收割一个灵魂就会变得更加致密,其打击具有震碎大地的力量。现在,这场无尽收割的遗物在一位新飞行员的手中苏醒了。", "zh-CN"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "守護者の扉破り", "ja"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"敵を倒すと{BaseTriggerChance.Value * 100f}%の確率で、永続的に{BaseDamagePerStack.Value}の基礎ダメージを獲得する。", "ja"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"敵を倒すと<style=cIsUtility>{BaseTriggerChance.Value * 100f}%の確率</style><style=cStack>({KillsForChanceIncrease.Value}キルごとに+{ChanceIncreaseAmount.Value * 100f}%)</style>で、永続的に<style=cIsDamage>{BaseDamagePerStack.Value}</style><style=cStack>(アイテムごとに+{StackDamageScaling.Value})</style>の基礎ダメージを獲得する。", "ja"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "時の砂に忘れ去られた伝説...\n\n古代の守護者はかつてこう言った。「生と死は循環である。我らは生き、彼らは死ぬ。」\n\nこの重い武器は、魂を刈り取るごとに密度を増し、その一撃は大地を揺るがすほどの威力になると言われている。今、この果てしない収穫の遺物が、新たなパイロットの手に握られ目を覚ます。", "ja"); LanguageAPI.Add("ITEM_KORUYUCU_NAME", "수호자의 문파괴자", "ko"); LanguageAPI.Add("ITEM_KORUYUCU_PICKUP", $"적을 처치하면 {BaseTriggerChance.Value * 100f}% 확률로 영구적으로 {BaseDamagePerStack.Value}의 기본 피해량을 얻습니다.", "ko"); LanguageAPI.Add("ITEM_KORUYUCU_DESC", $"적을 처치하면 <style=cIsUtility>{BaseTriggerChance.Value * 100f}% 확률로</style> <style=cStack>(처치 수 {KillsForChanceIncrease.Value}마다 +{ChanceIncreaseAmount.Value * 100f}%)</style> 영구적으로 <style=cIsDamage>{BaseDamagePerStack.Value}</style> <style=cStack>(아이템당 +{StackDamageScaling.Value})</style>의 기본 피해량을 얻습니다.", "ko"); LanguageAPI.Add("ITEM_KORUYUCU_LORE", "시간의 모래 속에 잊혀진 전설...\n\n고대의 수호자는 이렇게 말했다. \"삶과 죽음은 순환이다. 우리는 살고, 그들은 죽는다.\"\n\n이 무거운 무기는 영혼을 거둘 때마다 더 단단해지며, 그 일격은 대지를 뒤흔들 힘을 갖게 된다고 한다. 이제 이 끝없는 수확의 유물이 새로운 조종사의 손에서 깨어난다.", "ko"); } } }