using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.Toolbot;
using EntityStates.Treebot;
using EntityStates.Treebot.Weapon;
using HarmonyLib;
using IL.RoR2;
using KinematicCharacterController;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates;
using On.EntityStates.Treebot;
using On.EntityStates.Treebot.Weapon;
using On.RoR2;
using R2API;
using RoR2;
using RoR2.Projectile;
using RoR2.Skills;
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(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("HIFURexTweaks")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("HIFURexTweaks")]
[assembly: AssemblyTitle("HIFURexTweaks")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace HIFURexTweaks
{
public class ConfigManager
{
internal static bool ConfigChanged;
internal static bool VersionChanged;
public static T HandleConfig<T>(ConfigEntryBase entry, ConfigFile config, string name)
{
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Expected O, but got Unknown
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Expected O, but got Unknown
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Expected O, but got Unknown
MethodInfo methodInfo = (from x in typeof(ConfigFile).GetMethods()
where x.Name == "Bind"
select x).First();
methodInfo = methodInfo.MakeGenericMethod(typeof(T));
object[] parameters = new object[3]
{
(object)new ConfigDefinition(Regex.Replace(config.ConfigFilePath, "\\W", "") + " : " + entry.Definition.Section, name),
entry.DefaultValue,
(object)new ConfigDescription(entry.Description.Description, (AcceptableValueBase)null, Array.Empty<object>())
};
ConfigEntryBase val = (ConfigEntryBase)methodInfo.Invoke(config, parameters);
if (Main._preVersioning)
{
entry.BoxedValue = entry.DefaultValue;
}
if (!ConfigEqual(val.DefaultValue, val.BoxedValue) && VersionChanged)
{
entry.BoxedValue = entry.DefaultValue;
val.BoxedValue = val.DefaultValue;
}
return default(T);
}
private static bool ConfigEqual(object a, object b)
{
if (a.Equals(b))
{
return true;
}
if (float.TryParse(a.ToString(), out var result) && float.TryParse(b.ToString(), out var result2) && (double)Mathf.Abs(result - result2) < 0.0001)
{
return true;
}
return false;
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("HIFU.HIFURexTweaks", "HIFURexTweaks", "1.3.0")]
public class Main : BaseUnityPlugin
{
public const string PluginGUID = "HIFU.HIFURexTweaks";
public const string PluginAuthor = "HIFU";
public const string PluginName = "HIFURexTweaks";
public const string PluginVersion = "1.3.0";
public static ConfigFile HRTConfig;
public static ConfigFile HRTBackupConfig;
public static ManualLogSource HRTLogger;
public static bool _preVersioning;
public static BodyIndex rexBodyIndex;
public static ConfigEntry<bool> enableAutoConfig { get; set; }
public static ConfigEntry<string> latestVersion { get; set; }
public void Awake()
{
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Expected O, but got Unknown
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_0153: Expected O, but got Unknown
HRTLogger = ((BaseUnityPlugin)this).Logger;
HRTConfig = ((BaseUnityPlugin)this).Config;
HRTBackupConfig = new ConfigFile(Paths.ConfigPath + "\\HIFU.HIFURexTweaks.Backup.cfg", true);
HRTBackupConfig.Bind<string>(": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :", ": DO NOT MODIFY THIS FILES CONTENTS :");
enableAutoConfig = HRTConfig.Bind<bool>("Config", "Enable Auto Config Sync", true, "Disabling this would stop HIFURexTweaks from syncing config whenever a new version is found.");
_preVersioning = !((Dictionary<ConfigDefinition, string>)AccessTools.DeclaredPropertyGetter(typeof(ConfigFile), "OrphanedEntries").Invoke(HRTConfig, null)).Keys.Any((ConfigDefinition x) => x.Key == "Latest Version");
latestVersion = HRTConfig.Bind<string>("Config", "Latest Version", "1.3.0", "DO NOT CHANGE THIS");
if (enableAutoConfig.Value && (_preVersioning || latestVersion.Value != "1.3.0"))
{
latestVersion.Value = "1.3.0";
ConfigManager.VersionChanged = true;
HRTLogger.LogInfo((object)"Config Autosync Enabled.");
}
BodyCatalog.Init += new hook_Init(BodyCatalog_Init);
IEnumerable<Type> enumerable = from type in Assembly.GetExecutingAssembly().GetTypes()
where !type.IsAbstract && type.IsSubclassOf(typeof(TweakBase))
select type;
HRTLogger.LogInfo((object)"==+----------------==TWEAKS==----------------+==");
foreach (Type item in enumerable)
{
TweakBase tweakBase = (TweakBase)Activator.CreateInstance(item);
if (ValidateTweak(tweakBase))
{
tweakBase.Init();
}
}
IEnumerable<Type> enumerable2 = from type in Assembly.GetExecutingAssembly().GetTypes()
where !type.IsAbstract && type.IsSubclassOf(typeof(MiscBase))
select type;
HRTLogger.LogInfo((object)"==+----------------==MISC==----------------+==");
foreach (Type item2 in enumerable2)
{
MiscBase miscBase = (MiscBase)Activator.CreateInstance(item2);
if (ValidateMisc(miscBase))
{
miscBase.Init();
}
}
}
private IEnumerator BodyCatalog_Init(orig_Init orig)
{
yield return orig.Invoke();
rexBodyIndex = BodyCatalog.FindBodyIndex("TreebotBody(Clone)");
}
public bool ValidateTweak(TweakBase tb)
{
if (tb.isEnabled && ((BaseUnityPlugin)this).Config.Bind<bool>(tb.Name, "Enable?", true, "Vanilla is false").Value)
{
return true;
}
return false;
}
public bool ValidateMisc(MiscBase mb)
{
if (mb.isEnabled && ((BaseUnityPlugin)this).Config.Bind<bool>(mb.Name, "Enable?", true, "Vanilla is false").Value)
{
return true;
}
return false;
}
private void PeripheryMyBeloved()
{
}
}
public abstract class MiscBase
{
public abstract string Name { get; }
public virtual bool isEnabled { get; } = true;
public T ConfigOption<T>(T value, string name, string description)
{
ConfigEntry<T> val = Main.HRTConfig.Bind<T>(Name, name, value, description);
ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HRTBackupConfig, name);
return val.Value;
}
public abstract void Hooks();
public string d(float f)
{
return f * 100f + "%";
}
public virtual void Init()
{
Hooks();
Main.HRTLogger.LogInfo((object)("Added " + Name));
}
}
public abstract class MiscBase<T> : MiscBase where T : MiscBase<T>
{
public static T instance { get; set; }
public MiscBase()
{
if (instance != null)
{
throw new InvalidOperationException("Singleton class " + typeof(T).Name + " was instantiated twice");
}
instance = this as T;
}
}
public abstract class TweakBase
{
public abstract string Name { get; }
public abstract string SkillToken { get; }
public abstract string DescText { get; }
public virtual bool isEnabled { get; } = true;
public T ConfigOption<T>(T value, string name, string description)
{
ConfigEntry<T> val = Main.HRTConfig.Bind<T>(Name, name, value, description);
ConfigManager.HandleConfig<T>((ConfigEntryBase)(object)val, Main.HRTBackupConfig, name);
return val.Value;
}
public abstract void Hooks();
public string d(float f)
{
return f * 100f + "%";
}
public virtual void Init()
{
Hooks();
string text = "TREEBOT_" + SkillToken.ToUpper() + "_DESCRIPTION";
LanguageAPI.Add(text, DescText);
Main.HRTLogger.LogInfo((object)("Added " + Name));
}
}
public abstract class TweakBase<T> : TweakBase where T : TweakBase<T>
{
public static T instance { get; set; }
public TweakBase()
{
if (instance != null)
{
throw new InvalidOperationException("Singleton class " + typeof(T).Name + " was instantiated twice");
}
instance = this as T;
}
}
}
namespace HIFURexTweaks.Skills
{
public class BrambleVolley : TweakBase
{
public static float damage;
public static float healPercent;
public static float healthCost;
public static float cooldown;
public static float procCoefficient;
public override string Name => ": Utility :: Bramble Volley";
public override string SkillToken => "utility_alt1";
public override string DescText => "<style=cIsHealth>" + d(healthCost) + " HP</style>. Fire a <style=cIsUtility>Sonic Boom</style> that <style=cIsDamage>damages</style> enemies for <style=cIsDamage>" + d(damage) + " damage</style>. <style=cIsHealing>Heals " + d(healPercent) + " for every target hit</style>.";
public override void Init()
{
damage = ConfigOption(5f, "Damage", "Decimal. Vanilla is 5.5");
healPercent = ConfigOption(0.08f, "Heal Percent", "Decimal. Vanilla is 0.1");
healthCost = ConfigOption(0.2f, "Health Cost", "Decimal. Vanilla is 0.2");
cooldown = ConfigOption(5f, "Cooldown", "Vanilla is 5");
procCoefficient = ConfigOption(0.5f, "Proc Coefficient", "Vanilla is 0.5");
base.Init();
}
public override void Hooks()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
Changes();
FirePlantSonicBoom.OnEnter += new hook_OnEnter(FirePlantSonicBoom_OnEnter);
}
private void FirePlantSonicBoom_OnEnter(orig_OnEnter orig, FirePlantSonicBoom self)
{
FirePlantSonicBoom.damageCoefficient = damage;
FirePlantSonicBoom.healthFractionPerHit = healPercent;
FirePlantSonicBoom.healthCostFraction = healthCost;
FirePlantSonicBoom.procCoefficient = procCoefficient;
orig.Invoke(self);
}
public static void Changes()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Treebot/TreebotBodyPlantSonicBoom.asset").WaitForCompletion();
val.baseRechargeInterval = cooldown;
}
}
public class DIRECTIVEDisperse : TweakBase
{
public static float cooldown;
public static int maxStock;
public override string Name => ": Utility : Directive Disperse";
public override string SkillToken => "utility";
public override string DescText => "Fire a <style=cIsUtility>Sonic Boom</style> that <style=cIsDamage>Weakens</style> all enemies hit." + ((maxStock > 1) ? (" Can hold up to " + maxStock + ".") : "");
public override void Init()
{
cooldown = ConfigOption(4f, "Cooldown", "Vanilla is 5");
maxStock = ConfigOption(2, "Max Stock", "Vanilla is 1");
base.Init();
}
public override void Hooks()
{
Changes();
}
public static void Changes()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Treebot/TreebotBodySonicBoom.asset").WaitForCompletion();
val.baseRechargeInterval = cooldown;
val.baseMaxStock = maxStock;
}
}
public class DIRECTIVEDrill : TweakBase
{
public static float damage;
public static float procCoefficient;
public static float cooldown;
public static float duration;
public override string Name => ": Secondary : DIRECTIVE: Drill";
public override string SkillToken => "secondary_alt1";
public override string DescText => "Launch a series of seed bullets into the sky, raining down for <style=cIsDamage>" + d(16f * damage / cooldown) + " damage per second</style>.";
public override void Init()
{
damage = ConfigOption(1.6f, "Damage", "Decimal. Vanilla is 0.9");
procCoefficient = ConfigOption(1f, "Proc Coefficient", "Vanilla is 0.7");
cooldown = ConfigOption(5f, "Cooldown", "Vanilla is 6");
duration = ConfigOption(3f, "Duration", "Vanilla is 3");
base.Init();
}
public override void Hooks()
{
Changes();
}
public static void Changes()
{
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
ProjectileDotZone component = LegacyResourcesAPI.Load<GameObject>("prefabs/projectiles/TreebotMortarRain").GetComponent<ProjectileDotZone>();
component.damageCoefficient = damage / 4.5f;
component.lifetime = duration;
component.overlapProcCoefficient = procCoefficient;
SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Treebot/TreebotBodyAimMortarRain.asset").WaitForCompletion();
val.baseRechargeInterval = cooldown;
}
}
public class DIRECTIVEHarvest : TweakBase
{
[CompilerGenerated]
private static class <>O
{
public static StatHookEventHandler <0>__RecalculateStatsAPI_GetStatCoefficients;
public static hook_OnTriggerStay <1>__BuffPickup_OnTriggerStay;
}
public static float damage;
public static float cooldown;
public static float endlag;
public static float percentHeal;
public static bool giveBuffs;
public static float buffDuration;
public static BuffDef checkIfEligible;
public static BuffDef armorBuffDef;
public static BuffDef damageBuffDef;
public static BuffDef attackSpeedBuffDef;
public static BuffDef movementSpeedBuffDef;
public static float armorBuff;
public static float damageBuff;
public static float attackSpeedBuff;
public static float movementSpeedBuff;
public static BuffDef uselessBuff;
public override string Name => ": Special : DIRECTIVE: Harvest";
public override string SkillToken => "special_alt1";
public override string DescText => "Fire a bolt that deals <style=cIsDamage>" + d(damage) + " damage</style> and <style=cIsDamage>injects</style> an enemy. On death, drop multiple <style=cIsHealing>healing fruits</style> that heal for <style=cIsHealing>" + d(percentHeal) + " HP</style>" + (giveBuffs ? " and <style=cIsUtility>give a short buff</style> each." : ".");
public override void Init()
{
damage = ConfigOption(6f, "Damage", "Decimal. Vanilla is 3.3");
endlag = ConfigOption(0.3f, "Endlag", "Vanilla is 1");
cooldown = ConfigOption(6f, "Cooldown", "Vanilla is 6");
percentHeal = ConfigOption(0.12f, "Percent Heal", "Decimal. Vanilla is 0.25");
giveBuffs = ConfigOption(value: true, "Should fruit give Buffs?", "Vanilla is false");
buffDuration = ConfigOption(6f, "Buff Duration", "Vanilla is 0");
armorBuff = ConfigOption(8f, "Armor Buff", "Vanilla is 0");
damageBuff = ConfigOption(0.08f, "Damage Buff", "Decimal. Vanilla is 0");
attackSpeedBuff = ConfigOption(0.13f, "Attack Speed Buff", "Decimal. Vanilla, is 0");
movementSpeedBuff = ConfigOption(0.13f, "Movement Speed Buff", "Decimal. Vanilla is 0");
uselessBuff = ScriptableObject.CreateInstance<BuffDef>();
uselessBuff.isHidden = true;
uselessBuff.isDebuff = false;
uselessBuff.canStack = false;
uselessBuff.isCooldown = false;
((Object)uselessBuff).name = "Useless Buff";
ContentAddition.AddBuffDef(uselessBuff);
base.Init();
}
public override void Hooks()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Expected O, but got Unknown
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Expected O, but got Unknown
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Expected O, but got Unknown
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Expected O, but got Unknown
Changes();
TreebotFireFruitSeed.OnEnter += new hook_OnEnter(TreebotFireFruitSeed_OnEnter);
object obj = <>O.<0>__RecalculateStatsAPI_GetStatCoefficients;
if (obj == null)
{
StatHookEventHandler val = RecalculateStatsAPI_GetStatCoefficients;
<>O.<0>__RecalculateStatsAPI_GetStatCoefficients = val;
obj = (object)val;
}
RecalculateStatsAPI.GetStatCoefficients += (StatHookEventHandler)obj;
object obj2 = <>O.<1>__BuffPickup_OnTriggerStay;
if (obj2 == null)
{
hook_OnTriggerStay val2 = BuffPickup_OnTriggerStay;
<>O.<1>__BuffPickup_OnTriggerStay = val2;
obj2 = (object)val2;
}
BuffPickup.OnTriggerStay += (hook_OnTriggerStay)obj2;
GlobalEventManager.OnCharacterDeath += new Manipulator(GlobalEventManager_OnCharacterDeath);
TreebotPrepFruitSeed.OnEnter += new hook_OnEnter(TreebotPrepFruitSeed_OnEnter);
}
private void TreebotPrepFruitSeed_OnEnter(orig_OnEnter orig, TreebotPrepFruitSeed self)
{
self.baseDuration = 1f / 60f;
self.duration = 1f / 60f;
orig.Invoke(self);
}
private void GlobalEventManager_onCharacterDeathGlobal(DamageReport report)
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Invalid comparison between Unknown and I4
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
//IL_0128: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
if (!Object.op_Implicit((Object)(object)report.attacker))
{
return;
}
TeamIndex attackerTeamIndex = report.attackerTeamIndex;
CharacterBody victimBody = report.victimBody;
if (!Object.op_Implicit((Object)(object)victimBody) || (!victimBody.HasBuff(Buffs.Fruiting) && (report.damageInfo == null || (int)DamageTypeCombo.op_Implicit(report.damageInfo.damageType & DamageTypeCombo.op_Implicit((DamageType)536870912)) <= 0)))
{
return;
}
int num = Mathf.Min(Math.Max(1, (int)(victimBody.bestFitRadius * 2f)), 8);
GameObject val = LegacyResourcesAPI.Load<GameObject>("Prefabs/NetworkedObjects/TreebotFruitPack");
for (int i = 0; i < num; i++)
{
GameObject val2 = Object.Instantiate<GameObject>(val, victimBody.transform.position + Random.insideUnitSphere * victimBody.radius * 0.5f, Random.rotation);
TeamFilter component = val2.GetComponent<TeamFilter>();
if (Object.op_Implicit((Object)(object)component))
{
component.teamIndex = attackerTeamIndex;
}
val2.GetComponentInChildren<HealthPickup>();
val2.transform.localScale = new Vector3(1f, 1f, 1f);
NetworkServer.Spawn(val2);
}
}
private void GlobalEventManager_OnCharacterDeath(ILContext il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
ILCursor val = new ILCursor(il);
if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchLdstr(x, "Prefabs/Effects/TreebotFruitDeathEffect.prefab")
}))
{
for (int i = 0; i < 11; i++)
{
val.Remove();
}
}
else
{
Main.HRTLogger.LogError((object)"Failed to apply VFX Hook");
}
val.Index = 0;
}
private void TreebotFireFruitSeed_OnEnter(orig_OnEnter orig, TreebotFireFruitSeed self)
{
self.damageCoefficient = damage;
self.baseDuration = endlag;
orig.Invoke(self);
}
public static void BuffPickup_OnTriggerStay(orig_OnTriggerStay orig, BuffPickup self, Collider other)
{
if (Object.op_Implicit((Object)(object)self) && (Object)(object)self.buffDef == (Object)(object)checkIfEligible)
{
switch (Random.RandomRangeInt(1, 5))
{
case 1:
self.buffDef = armorBuffDef;
break;
case 2:
self.buffDef = damageBuffDef;
break;
case 3:
self.buffDef = attackSpeedBuffDef;
break;
default:
self.buffDef = movementSpeedBuffDef;
break;
}
}
orig.Invoke(self, other);
}
public static void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args)
{
if (Object.op_Implicit((Object)(object)sender.inventory))
{
args.armorAdd += armorBuff * (float)sender.GetBuffCount(armorBuffDef);
args.damageMultAdd += damageBuff * (float)sender.GetBuffCount(damageBuffDef);
args.attackSpeedMultAdd += attackSpeedBuff * (float)sender.GetBuffCount(attackSpeedBuffDef);
args.moveSpeedMultAdd += movementSpeedBuff * (float)sender.GetBuffCount(movementSpeedBuffDef);
}
}
public static void Changes()
{
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: 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_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00db: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//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_0148: Unknown result type (might be due to invalid IL or missing references)
//IL_014d: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
//IL_025b: Unknown result type (might be due to invalid IL or missing references)
//IL_026a: Unknown result type (might be due to invalid IL or missing references)
//IL_0292: Unknown result type (might be due to invalid IL or missing references)
//IL_0297: Unknown result type (might be due to invalid IL or missing references)
//IL_029c: Unknown result type (might be due to invalid IL or missing references)
//IL_0308: Unknown result type (might be due to invalid IL or missing references)
//IL_0317: Unknown result type (might be due to invalid IL or missing references)
//IL_033f: Unknown result type (might be due to invalid IL or missing references)
//IL_0344: Unknown result type (might be due to invalid IL or missing references)
//IL_0349: Unknown result type (might be due to invalid IL or missing references)
//IL_03b5: Unknown result type (might be due to invalid IL or missing references)
//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
//IL_03ec: 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_0426: Unknown result type (might be due to invalid IL or missing references)
//IL_042b: Unknown result type (might be due to invalid IL or missing references)
LanguageAPI.Add("TREEBOT_SPECIAL_ALT1_NAME", "DIRECTIVE: Harvest");
SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Treebot/TreebotBodyFireFruitSeed.asset").WaitForCompletion();
val.baseRechargeInterval = cooldown;
GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/TreebotFruitPack.prefab").WaitForCompletion();
Object.Destroy((Object)(object)val2.GetComponent<EffectComponent>());
Transform child = val2.transform.GetChild(2);
((Component)child).GetComponent<HealthPickup>().fractionalHealing = percentHeal;
checkIfEligible = ScriptableObject.CreateInstance<BuffDef>();
checkIfEligible.isDebuff = false;
checkIfEligible.canStack = false;
checkIfEligible.iconSprite = null;
checkIfEligible.buffColor = Color32.op_Implicit(new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, byte.MaxValue));
checkIfEligible.isHidden = true;
ContentAddition.AddBuffDef(checkIfEligible);
GameObject val3 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/TreebotFruitSeedProjectile.prefab").WaitForCompletion();
val3.transform.localScale = new Vector3(2f, 2f, 2f);
if (giveBuffs)
{
Texture2D val4 = Addressables.LoadAssetAsync<Texture2D>((object)"RoR2/Base/Common/texBuffGenericShield.tif").WaitForCompletion();
Texture2D val5 = Addressables.LoadAssetAsync<Texture2D>((object)"RoR2/Base/LunarSkillReplacements/texBuffLunarDetonatorIcon.tif").WaitForCompletion();
Texture2D val6 = Addressables.LoadAssetAsync<Texture2D>((object)"RoR2/Base/AttackSpeedOnCrit/texBuffAttackSpeedOnCritIcon.tif").WaitForCompletion();
Texture2D val7 = Addressables.LoadAssetAsync<Texture2D>((object)"RoR2/Base/Common/texMovespeedBuffIcon.tif").WaitForCompletion();
armorBuffDef = ScriptableObject.CreateInstance<BuffDef>();
armorBuffDef.isDebuff = false;
armorBuffDef.canStack = true;
armorBuffDef.iconSprite = Sprite.Create(val4, new Rect(0f, 0f, (float)((Texture)val4).width, (float)((Texture)val4).height), new Vector2(0f, 0f));
armorBuffDef.buffColor = Color32.op_Implicit(new Color32((byte)243, (byte)243, (byte)184, (byte)225));
((Object)armorBuffDef).name = "DIRECTIVE: Harvest Armor";
armorBuffDef.canStack = true;
ContentAddition.AddBuffDef(armorBuffDef);
damageBuffDef = ScriptableObject.CreateInstance<BuffDef>();
damageBuffDef.isDebuff = false;
damageBuffDef.canStack = true;
damageBuffDef.iconSprite = Sprite.Create(val5, new Rect(0f, 0f, (float)((Texture)val5).width, (float)((Texture)val5).height), new Vector2(0f, 0f));
damageBuffDef.buffColor = Color32.op_Implicit(new Color32((byte)243, (byte)243, (byte)184, (byte)225));
((Object)damageBuffDef).name = "DIRECTIVE: Harvest Damage";
damageBuffDef.canStack = true;
ContentAddition.AddBuffDef(damageBuffDef);
attackSpeedBuffDef = ScriptableObject.CreateInstance<BuffDef>();
attackSpeedBuffDef.isDebuff = false;
attackSpeedBuffDef.canStack = true;
attackSpeedBuffDef.iconSprite = Sprite.Create(val6, new Rect(0f, 0f, (float)((Texture)val6).width, (float)((Texture)val6).height), new Vector2(0f, 0f));
attackSpeedBuffDef.buffColor = Color32.op_Implicit(new Color32((byte)243, (byte)243, (byte)184, (byte)225));
((Object)attackSpeedBuffDef).name = "DIRECTIVE: Harvest Attack Speed";
attackSpeedBuffDef.canStack = true;
ContentAddition.AddBuffDef(attackSpeedBuffDef);
movementSpeedBuffDef = ScriptableObject.CreateInstance<BuffDef>();
movementSpeedBuffDef.isDebuff = false;
movementSpeedBuffDef.canStack = true;
movementSpeedBuffDef.iconSprite = Sprite.Create(val7, new Rect(0f, 0f, (float)((Texture)val7).width, (float)((Texture)val7).height), new Vector2(0f, 0f));
movementSpeedBuffDef.buffColor = Color32.op_Implicit(new Color32((byte)243, (byte)243, (byte)184, (byte)225));
((Object)movementSpeedBuffDef).name = "DIRECTIVE: Harvest Move Speed";
movementSpeedBuffDef.canStack = true;
ContentAddition.AddBuffDef(movementSpeedBuffDef);
GameObject val8 = PrefabAPI.InstantiateClone(Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Common/VFX/HealthOrbEffect.prefab").WaitForCompletion(), "DIRECTIVE: Harvest Pickup", false);
val8.SetActive(false);
ContentAddition.AddEffect(val8);
BuffPickup val9 = ((Component)child).gameObject.AddComponent<BuffPickup>();
val9.teamFilter = val2.GetComponent<TeamFilter>();
val9.buffDef = checkIfEligible;
val9.buffDuration = buffDuration;
val9.pickupEffect = val8;
val9.baseObject = ((Component)child).gameObject;
}
}
}
public class DIRECTIVEInject : TweakBase
{
public static float damage;
public static float procCoefficient;
public static int syringes;
public static float durationPer;
public static float healPercent;
public override string Name => ": Primary : DIRECTIVE: Inject";
public override string SkillToken => "primary";
public override string DescText => "Fire " + syringes + " syringes for <style=cIsDamage>" + syringes + "x" + d(damage) + " damage</style>. The last syringe <style=cIsDamage>Weakens</style> and <style=cIsHealing>heals for " + d(healPercent) + " of damage dealt</style>.";
public override void Init()
{
damage = ConfigOption(0.8f, "Damage", "Decimal. Vanilla is 0.8");
syringes = ConfigOption(3, "Syringe Count", "Vanilla is 3");
durationPer = ConfigOption(0.2f, "Duration Per Syringe", "Vanilla is 0.2");
healPercent = ConfigOption(0.45f, "Healing Percentage", "Decimal. Vanilla is 0.6");
procCoefficient = ConfigOption(0.5f, "Proc Coefficient", "Vanilla is 0.5");
base.Init();
}
public override void Hooks()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
Changes();
FireSyringe.OnEnter += new hook_OnEnter(FireSyringe_OnEnter);
}
private void FireSyringe_OnEnter(orig_OnEnter orig, FireSyringe self)
{
FireSyringe.damageCoefficient = damage;
FireSyringe.projectileCount = syringes;
FireSyringe.baseFireDuration = durationPer;
FireSyringe.baseDuration = (float)syringes * durationPer;
orig.Invoke(self);
}
public static void Changes()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/SyringeProjectile.prefab").WaitForCompletion();
ProjectileController component = val.GetComponent<ProjectileController>();
component.procCoefficient = procCoefficient;
ProjectileTargetComponent val2 = val.AddComponent<ProjectileTargetComponent>();
((Behaviour)val2).enabled = true;
ProjectileSteerTowardTarget val3 = val.AddComponent<ProjectileSteerTowardTarget>();
((Behaviour)val3).enabled = true;
val3.rotationSpeed = 1080f;
ProjectileDirectionalTargetFinder val4 = val.AddComponent<ProjectileDirectionalTargetFinder>();
((Behaviour)val4).enabled = true;
val4.lookRange = 20f;
val4.lookCone = 10f;
val4.targetSearchInterval = 0.1f;
val4.onlySearchIfNoTarget = true;
val4.allowTargetLoss = false;
val4.testLoS = false;
val4.ignoreAir = false;
val4.flierAltitudeTolerance = float.PositiveInfinity;
GameObject val5 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/SyringeProjectileHealing.prefab").WaitForCompletion();
val5.GetComponent<ProjectileHealOwnerOnDamageInflicted>().fractionOfDamage = healPercent;
ProjectileController component2 = val5.GetComponent<ProjectileController>();
component2.procCoefficient = procCoefficient;
ProjectileTargetComponent val6 = val5.AddComponent<ProjectileTargetComponent>();
((Behaviour)val6).enabled = true;
ProjectileSteerTowardTarget val7 = val5.AddComponent<ProjectileSteerTowardTarget>();
((Behaviour)val7).enabled = true;
val7.rotationSpeed = 1080f;
ProjectileDirectionalTargetFinder val8 = val5.AddComponent<ProjectileDirectionalTargetFinder>();
((Behaviour)val8).enabled = true;
val8.lookRange = 20f;
val8.lookCone = 10f;
val8.targetSearchInterval = 0.1f;
val8.onlySearchIfNoTarget = true;
val8.allowTargetLoss = false;
val8.testLoS = false;
val8.ignoreAir = false;
val8.flierAltitudeTolerance = float.PositiveInfinity;
}
}
public class SeedBarrage : TweakBase
{
public static float damage;
public static float cooldown;
public static float healthCost;
public override string Name => ": Secondary :: Seed Barrage";
public override string SkillToken => "secondary";
public override string DescText => "<style=cIsHealth>" + d(healthCost) + " HP</style>. Launch a mortar into the sky for <style=cIsDamage>" + d(damage) + " damage</style>.";
public override void Init()
{
damage = ConfigOption(3.7f, "Damage", "Decimal. Vanilla is 4.5");
cooldown = ConfigOption(0.5f, "Cooldown", "Vanilla is 0.5");
healthCost = ConfigOption(0.15f, "Health Cost", "Decimal. Vanilla is 0.15");
base.Init();
}
public override void Hooks()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
Changes();
FireMortar2.OnEnter += new hook_OnEnter(FireMortar2_OnEnter);
}
private void FireMortar2_OnEnter(orig_OnEnter orig, FireMortar2 self)
{
FireMortar2.damageCoefficient = damage;
FireMortar2.healthCostFraction = healthCost;
orig.Invoke(self);
}
public static void Changes()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Treebot/TreebotBodyAimMortar2.asset").WaitForCompletion();
val.baseRechargeInterval = cooldown;
}
}
public class TanglingGrowth : TweakBase
{
public static float rootDamage;
public static float healPercent;
public static int pulseCount;
public static float healthCost;
public static float cooldown;
public static float radius;
public override string Name => ": Special :: Tangling Growth";
public override string SkillToken => "special";
public override string DescText => "<style=cIsHealth>" + d(healthCost) + " HP</style>. Fire a flower that <style=cIsDamage>roots</style> for <style=cIsDamage>" + d(rootDamage) + " damage</style>. <style=cIsHealing>Heals " + d(healPercent / (float)(pulseCount - 1) * 0.25f) + " HP for every target hit</style>, up to <style=cIsHealing>" + (pulseCount - 1) * 4 + "</style> times.";
public override void Init()
{
rootDamage = ConfigOption(2f, "Root Damage", "Decimal. Vanilla is 2");
healPercent = ConfigOption(0.08f, "Heal Percent", "Decimal. Formula for Healing Per Pulse: (Heal Percent / (Pulse Count - 1)) * 0.25. Vanilla is 0.08");
pulseCount = ConfigOption(5, "Pulse Count", "Vanilla is 5");
healthCost = ConfigOption(0.25f, "Health Cost", "Decimal. Vanilla is 0.25");
cooldown = ConfigOption(12f, "Cooldown", "Vanilla is 12");
radius = ConfigOption(10f, "Radius", "Vanilla is 10");
base.Init();
}
public override void Hooks()
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Expected O, but got Unknown
Changes();
FireFlower2.OnEnter += new hook_OnEnter(FireFlower2_OnEnter);
FlowerProjectileHover.OnEnter += new hook_OnEnter(FlowerProjectileHover_OnEnter);
}
private void FlowerProjectileHover_OnEnter(orig_OnEnter orig, FlowerProjectileHover self)
{
((DroneProjectileHover)self).pulseCount = pulseCount;
((DroneProjectileHover)self).pulseRadius = radius;
FlowerProjectileHover.healthFractionYieldPerHit = healPercent;
orig.Invoke(self);
}
private void FireFlower2_OnEnter(orig_OnEnter orig, FireFlower2 self)
{
FireFlower2.damageCoefficient = rootDamage;
FireFlower2.healthCostFraction = healthCost;
orig.Invoke(self);
}
public static void Changes()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
SkillDef val = Addressables.LoadAssetAsync<SkillDef>((object)"RoR2/Base/Treebot/TreebotBodyFireFlower2.asset").WaitForCompletion();
val.baseRechargeInterval = cooldown;
}
}
}
namespace HIFURexTweaks.Misc
{
internal class HurtBox : MiscBase
{
public static float SizeMultiplier;
public override string Name => ": Misc : Hurt Box";
public override void Init()
{
SizeMultiplier = ConfigOption(0.66f, "Size Multiplier", "Vanilla is 1");
base.Init();
}
public override void Hooks()
{
Changes();
}
private void Changes()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/Treebot/TreebotBody.prefab").WaitForCompletion();
CapsuleCollider component = ((Component)val.transform.GetChild(0).GetChild(0).GetChild(0)
.GetChild(0)
.Find("TempHurtbox")).GetComponent<CapsuleCollider>();
component.radius = 1.42f * SizeMultiplier;
component.height = 4.26f * SizeMultiplier;
}
}
internal class WallClimbing : MiscBase
{
public override string Name => ": Misc : Wall Climbing";
public override void Init()
{
base.Init();
}
public override void Hooks()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
CharacterMotor.GenerateParameters += new hook_GenerateParameters(CharacterMotor_GenerateParameters);
}
private void CharacterMotor_GenerateParameters(orig_GenerateParameters orig, CharacterMotor self)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
orig.Invoke(self);
CharacterBody body = self.body;
if (Object.op_Implicit((Object)(object)body) && body.bodyIndex == Main.rexBodyIndex)
{
KinematicCharacterMotor component = ((Component)body).GetComponent<KinematicCharacterMotor>();
component.LedgeAndDenivelationHandling = true;
component.MaxStableSlopeAngle = 89f;
component.MaxStepHeight = 2f;
component.MinRequiredStepDepth = 0f;
component.MaxStableDenivelationAngle = 180f;
}
}
}
}