using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using EntityStates.Duplicator;
using EntityStates.Scrapper;
using IL.EntityStates.Duplicator;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.EntityStates.Duplicator;
using On.RoR2;
using R2API.Utils;
using RoR2;
using UnityEngine;
using UnityEngine.Networking;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("KannaQoL")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("KannaQoL")]
[assembly: AssemblyTitle("KannaQoL")]
[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 SylmarDev.KannasQoL
{
public class KannasConfig
{
public static ConfigEntry<bool> enableFastScrapper;
public static ConfigEntry<bool> enableBazaarScrapper;
public static ConfigEntry<bool> enableSeerPing;
public static ConfigEntry<bool> enableInstaTeleporter;
public static ConfigEntry<bool> enableCleansingPool;
public static ConfigEntry<bool> enableSingleFrog;
public static ConfigEntry<int> frogStatueCost;
public void Init(string configPath)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
ConfigFile val = new ConfigFile(Path.Combine(configPath, "SylmarDev.KannasQualityofLife.cfg"), true);
enableFastScrapper = val.Bind<bool>("Tweaks", "Enable Fast Scrapper", true, "Set to true to enable fast scrapper.");
enableBazaarScrapper = val.Bind<bool>("Tweaks", "Enable Scrapper in Bazaar", true, "Set to true to put scrapper in the Bazaar in Time.");
enableSeerPing = val.Bind<bool>("Tweaks", "Enable Seer Ping", true, "Set to true to ping Lunar Seers for destination.");
enableInstaTeleporter = val.Bind<bool>("Tweaks", "Enable Instant Teleporter", true, "Set to true to instantly finish charging teleporter after boss is killed, with time adjusted.");
enableCleansingPool = val.Bind<bool>("Tweaks", "Enable Cleansing Pool", true, "Set to true for guaranteed Cleansing Pool on Alphesian Sanctuary.");
enableSingleFrog = val.Bind<bool>("Tweaks", "Enable Single Frog Pet", true, "Set to true to only pet the Glass Frog once for Deep Void Portal.");
frogStatueCost = val.Bind<int>("Tweaks", "Frog Statue Cost", 10, "Required Lunar Coins per Glass Frog Pet.");
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("SylmarDev.KannasQualityofLife", "KannasQualityofLife", "0.2.2")]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
public class KannasQoL : BaseUnityPlugin
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static Func<Instruction, bool> <>9__8_1;
public static Func<Instruction, bool> <>9__8_2;
public static Func<Instruction, bool> <>9__8_3;
public static Func<Instruction, bool> <>9__8_4;
public static Func<Instruction, bool> <>9__8_5;
public static Func<Instruction, bool> <>9__8_6;
public static Func<Instruction, bool> <>9__8_7;
public static Func<Instruction, bool> <>9__8_8;
public static Func<Instruction, bool> <>9__8_9;
public static Manipulator <>9__8_0;
internal void <Awake>b__8_0(ILContext il)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
ILCursor val = new ILCursor(il);
if (val.TryGotoNext(new Func<Instruction, bool>[9]
{
(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"),
(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")),
(Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Blt_Un_S),
(Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0),
(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Duplicating>(x, "BeginCooking"),
(Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0),
(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"),
(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")),
(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("timeBetweenStartAndDropDroplet"))
}))
{
int index = val.Index;
val.Index = index + 1;
val.Remove();
val.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroInitialDelayDuration");
val.Index += 5;
val.Remove();
val.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroInitialDelayDuration");
val.Remove();
val.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroTimeBetweenStartAndDropDroplet");
}
else
{
Log.LogError("Printer couldn't shortcut");
}
}
internal bool <Awake>b__8_1(Instruction x)
{
return ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge");
}
internal bool <Awake>b__8_2(Instruction x)
{
return ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration"));
}
internal bool <Awake>b__8_3(Instruction x)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return ILPatternMatchingExt.Match(x, OpCodes.Blt_Un_S);
}
internal bool <Awake>b__8_4(Instruction x)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0);
}
internal bool <Awake>b__8_5(Instruction x)
{
return ILPatternMatchingExt.MatchCallOrCallvirt<Duplicating>(x, "BeginCooking");
}
internal bool <Awake>b__8_6(Instruction x)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
return ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0);
}
internal bool <Awake>b__8_7(Instruction x)
{
return ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge");
}
internal bool <Awake>b__8_8(Instruction x)
{
return ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration"));
}
internal bool <Awake>b__8_9(Instruction x)
{
return ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("timeBetweenStartAndDropDroplet"));
}
}
public const string PluginAuthor = "SylmarDev";
public const string PluginName = "KannasQualityofLife";
public const string PluginGUID = "SylmarDev.KannasQualityofLife";
public const string PluginVersion = "0.2.2";
public static AssetBundle assets;
public static float zeroInitialDelayDuration;
public static float zeroTimeBetweenStartAndDropDroplet;
public List<ScrapperLocation> slocations = new List<ScrapperLocation>
{
new ScrapperLocation
{
Position = new Vector3(-82.1f, -23.7f, -5.2f),
Rotation = new Vector3(0f, 72.6f, 0f)
},
new ScrapperLocation
{
Position = new Vector3(-95.1f, -25.2f, -45.2f),
Rotation = new Vector3(0f, 72.6f, 0f)
},
new ScrapperLocation
{
Position = new Vector3(-134.1f, -25.4f, -20.2f),
Rotation = new Vector3(0f, 72.6f, 0f)
},
new ScrapperLocation
{
Position = new Vector3(-122.1f, -23.7f, -5.2f),
Rotation = new Vector3(0f, 72.6f, 0f)
}
};
public void Awake()
{
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Expected O, but got Unknown
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Expected O, but got Unknown
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Expected O, but got Unknown
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Expected O, but got Unknown
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Expected O, but got Unknown
//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
//IL_00f2: Expected O, but got Unknown
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Expected O, but got Unknown
//IL_0140: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Expected O, but got Unknown
Log.Init(((BaseUnityPlugin)this).Logger);
new KannasConfig().Init(Paths.ConfigPath);
Log.LogInfo("SylmarDev.KannasQualityofLife // ver 0.2.2");
Log.LogInfo("Loading Resources. . .");
Log.LogInfo("Assigning hooks. . .");
if (KannasConfig.enableFastScrapper.Value)
{
Stage.onStageStartGlobal += Stage_Start;
Duplicating.BeginCooking += new hook_BeginCooking(Duplicating_BeginCooking);
object obj = <>c.<>9__8_0;
if (obj == null)
{
Manipulator val = delegate(ILContext il)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Expected O, but got Unknown
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
ILCursor val2 = new ILCursor(il);
if (val2.TryGotoNext(new Func<Instruction, bool>[9]
{
(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"),
(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")),
(Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Blt_Un_S),
(Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0),
(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<Duplicating>(x, "BeginCooking"),
(Instruction x) => ILPatternMatchingExt.Match(x, OpCodes.Ldarg_0),
(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<EntityState>(x, "get_fixedAge"),
(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("initialDelayDuration")),
(Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(Duplicating).GetField("timeBetweenStartAndDropDroplet"))
}))
{
int index = val2.Index;
val2.Index = index + 1;
val2.Remove();
val2.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroInitialDelayDuration");
val2.Index += 5;
val2.Remove();
val2.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroInitialDelayDuration");
val2.Remove();
val2.Emit<KannasQoL>(OpCodes.Ldsfld, "zeroTimeBetweenStartAndDropDroplet");
}
else
{
Log.LogError("Printer couldn't shortcut");
}
};
<>c.<>9__8_0 = val;
obj = (object)val;
}
Duplicating.FixedUpdate += (Manipulator)obj;
Duplicating.DropDroplet += new hook_DropDroplet(Duplicating_DropDroplet);
}
if (KannasConfig.enableBazaarScrapper.Value)
{
BazaarController.Awake += new hook_Awake(BazaarController_Awake);
}
if (KannasConfig.enableSeerPing.Value)
{
Util.GetBestBodyName += new hook_GetBestBodyName(Util_GetBestBodyName);
}
if (KannasConfig.enableInstaTeleporter.Value)
{
TeleporterInteraction.UpdateMonstersClear += new hook_UpdateMonstersClear(TeleporterInteraction_UpdateMonstersClear);
}
if (KannasConfig.enableCleansingPool.Value)
{
Stage.onStageStartGlobal += Stage_Start_CleansingPool;
}
if (KannasConfig.enableSingleFrog.Value)
{
FrogController.Pet += new hook_Pet(FrogController_Pet);
}
if (KannasConfig.frogStatueCost.Value != 1)
{
PurchaseInteraction.Awake += new hook_Awake(PurchaseInteraction_Awake);
}
Log.LogInfo("Awake done.");
}
private void Stage_onStageStartGlobal(Stage obj)
{
throw new NotImplementedException();
}
private void Stage_Start(Stage self)
{
((BaseUnityPlugin)this).Logger.Log((LogLevel)32, (object)"Called Stage_Start()");
WaitToBeginScrapping.duration = 0f;
Scrapping.duration = 0f;
ScrappingToIdle.duration = 0f;
Duplicating.initialDelayDuration = 0.01f;
Duplicating.timeBetweenStartAndDropDroplet = 0.01f;
}
private void Duplicating_BeginCooking(orig_BeginCooking orig, Duplicating self)
{
if (!NetworkServer.active)
{
orig.Invoke(self);
}
}
private void Duplicating_DropDroplet(orig_DropDroplet orig, Duplicating self)
{
orig.Invoke(self);
if (NetworkServer.active)
{
((Component)((EntityState)self).outer).GetComponent<PurchaseInteraction>().Networkavailable = true;
}
}
private void BazaarController_Awake(orig_Awake orig, BazaarController self)
{
orig.Invoke(self);
bool active = NetworkServer.active;
int num = 0;
if (!active)
{
return;
}
foreach (ScrapperLocation slocation in slocations)
{
if (num >= PlayerCharacterMasterController.instances.Count)
{
break;
}
SpawnScrapper(slocation);
num++;
}
}
private void SpawnScrapper(ScrapperLocation location)
{
//IL_0000: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Expected O, but got Unknown
//IL_0008: 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_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Expected O, but got Unknown
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
DirectorPlacementRule val = new DirectorPlacementRule();
val.placementMode = (PlacementMode)0;
SpawnCard val2 = Resources.Load<SpawnCard>("SpawnCards/InteractableSpawnCard/iscScrapper");
GameObject spawnedInstance = val2.DoSpawn(location.Position, Quaternion.identity, new DirectorSpawnRequest(val2, val, Run.instance.runRNG)).spawnedInstance;
spawnedInstance.transform.eulerAngles = location.Rotation;
NetworkServer.Spawn(spawnedInstance);
}
private string Util_GetBestBodyName(orig_GetBestBodyName orig, GameObject bodyObject)
{
if (((Object)bodyObject).name.Contains("SeerStation"))
{
string text = Language.GetString(SceneCatalog.GetSceneDef((SceneIndex)bodyObject.GetComponent<SeerStationController>().NetworktargetSceneDefIndex).portalSelectionMessageString).Substring(31).Trim();
Log.LogMessage(text);
return "A dream of " + text.Split('<')[0] + " ";
}
return orig.Invoke(bodyObject);
}
private void TeleporterInteraction_UpdateMonstersClear(orig_UpdateMonstersClear orig, TeleporterInteraction self)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Invalid comparison between Unknown and I4
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
orig.Invoke(self);
if (self.monstersCleared && Object.op_Implicit((Object)(object)self.holdoutZoneController) && (int)self.activationState == 2 && self.chargeFraction > 0.02f)
{
int displayChargePercent = TeleporterInteraction.instance.holdoutZoneController.displayChargePercent;
float runStopwatch = Run.instance.GetRunStopwatch();
int num = Math.Min(Util.GetItemCountForTeam(self.holdoutZoneController.chargingTeam, Items.FocusConvergence.itemIndex, true, true), 3);
float num2 = (100f - (float)displayChargePercent) / 100f * (TeleporterInteraction.instance.holdoutZoneController.baseChargeDuration / (1f + 0.3f * (float)num));
num2 = (float)Math.Round(num2, 2);
float runStopwatch2 = runStopwatch + (float)Math.Round(num2, 2);
Run.instance.SetRunStopwatch(runStopwatch2);
TeleporterInteraction.instance.holdoutZoneController.FullyChargeHoldoutZone();
}
}
private void Stage_Start_CleansingPool(Stage self)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Expected O, but got Unknown
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Expected O, but got Unknown
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
((BaseUnityPlugin)this).Logger.Log((LogLevel)32, (object)"Called Stage_Start_CleansingPool()");
if (SceneInfo.instance.sceneDef.baseSceneName == "ancientloft")
{
DirectorPlacementRule val = new DirectorPlacementRule();
val.placementMode = (PlacementMode)0;
SpawnCard val2 = Resources.Load<SpawnCard>("SpawnCards/InteractableSpawnCard/iscShrineCleanse");
Vector3 val3 = default(Vector3);
((Vector3)(ref val3))..ctor(-68f, 40.5f, 6.3f);
GameObject spawnedInstance = val2.DoSpawn(val3, Quaternion.identity, new DirectorSpawnRequest(val2, val, Run.instance.runRNG)).spawnedInstance;
spawnedInstance.transform.eulerAngles = new Vector3(0f, 0f, 0f);
NetworkServer.Spawn(spawnedInstance);
}
}
private void FrogController_Pet(orig_Pet orig, FrogController self, Interactor interactor)
{
self.maxPets = 1;
Log.LogInfo(((Object)self.purchaseInteraction).name);
orig.Invoke(self, interactor);
}
private void PurchaseInteraction_Awake(orig_Awake orig, PurchaseInteraction self)
{
orig.Invoke(self);
AdjustFrogPrice(self);
}
private static void AdjustFrogPrice(PurchaseInteraction self)
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
if (((Object)self).name.StartsWith("FrogInteractable"))
{
self.cost = KannasConfig.frogStatueCost.Value;
if (KannasConfig.frogStatueCost.Value == 0)
{
self.costType = (CostTypeIndex)0;
}
}
}
}
public class ScrapperLocation
{
public Vector3 Position;
public Vector3 Rotation;
}
internal static class Log
{
internal static ManualLogSource _logSource;
internal static void Init(ManualLogSource logSource)
{
_logSource = logSource;
}
internal static void LogDebug(object data)
{
_logSource.LogDebug(data);
}
internal static void LogError(object data)
{
_logSource.LogError(data);
}
internal static void LogFatal(object data)
{
_logSource.LogFatal(data);
}
internal static void LogInfo(object data)
{
_logSource.LogInfo(data);
}
internal static void LogMessage(object data)
{
_logSource.LogMessage(data);
}
internal static void LogWarning(object data)
{
_logSource.LogWarning(data);
}
}
}