using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using EntityStates;
using EntityStates.FalseSon;
using HG.BlendableTypes;
using Microsoft.CodeAnalysis;
using On.EntityStates.FalseSon;
using R2API;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Skills;
using RoR2.UI;
using SillyFalseSon;
using UnityEngine;
using UnityEngine.AddressableAssets;
[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("SillyFalseSon")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+fb5db6113e4843833d43a6940424b1b544b78664")]
[assembly: AssemblyProduct("SillyFalseSon")]
[assembly: AssemblyTitle("SillyFalseSon")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.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]
[Microsoft.CodeAnalysis.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;
}
}
}
internal static class Configuration
{
private static bool loadedIcon;
public static ConfigEntry<T> BindAndOptions<T>(string section, string name, T defaultValue, string description = "", bool restartRequired = false)
{
return BindAndOptions(section, name, defaultValue, 0f, 20f, description, restartRequired);
}
public static ConfigEntry<T> BindAndOptions<T>(string section, string name, T defaultValue, float min, float max, string description = "", bool restartRequired = false)
{
if (string.IsNullOrEmpty(description))
{
description = name;
}
description += $"\nDefault: {defaultValue}";
if (restartRequired)
{
description += " (restart required)";
}
ConfigEntry<T> val = ((BaseUnityPlugin)SillyFalseSonPlugin.instance).Config.Bind<T>(section, name, defaultValue, description);
if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"))
{
TryRegisterOption<T>(val, min, max, restartRequired);
}
return val;
}
public static ConfigEntry<float> BindAndOptionsSlider(string section, string name, float defaultValue, string description, float min = 0f, float max = 20f, bool restartRequired = false)
{
return BindAndOptions(section, name, defaultValue, min, max, description, restartRequired);
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
private static void TryRegisterOption<T>(ConfigEntry<T> entry, float min, float max, bool restartRequired)
{
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: 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_0021: 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_0038: Expected O, but got Unknown
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Expected O, but got Unknown
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Expected O, but got Unknown
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Expected O, but got Unknown
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Expected O, but got Unknown
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Expected O, but got Unknown
if (entry is ConfigEntry<float>)
{
ModSettingsManager.AddOption((BaseOption)new SliderOption(entry as ConfigEntry<float>, new SliderConfig
{
min = min,
max = max,
formatString = "{0:0.00}",
restartRequired = restartRequired
}));
}
if (entry is ConfigEntry<int>)
{
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(entry as ConfigEntry<int>, new IntSliderConfig
{
min = (int)min,
max = (int)max,
restartRequired = restartRequired
}));
}
if (entry is ConfigEntry<bool>)
{
ModSettingsManager.AddOption((BaseOption)new CheckBoxOption(entry as ConfigEntry<bool>, restartRequired));
}
if (entry is ConfigEntry<KeyboardShortcut>)
{
ModSettingsManager.AddOption((BaseOption)new KeyBindOption(entry as ConfigEntry<KeyboardShortcut>, restartRequired));
}
if (!loadedIcon)
{
loadedIcon = true;
try
{
ModSettingsManager.SetModIcon(LoadSpriteFromModFolder("icon.png"));
}
catch (Exception ex)
{
Debug.LogError((object)("error adding ROO mod icon\n" + ex));
}
}
}
public static bool GetKeyPressed(ConfigEntry<KeyboardShortcut> entry)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: 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)
KeyboardShortcut value = entry.Value;
foreach (KeyCode modifier in ((KeyboardShortcut)(ref value)).Modifiers)
{
if (!Input.GetKey(modifier))
{
return false;
}
}
value = entry.Value;
return Input.GetKeyDown(((KeyboardShortcut)(ref value)).MainKey);
}
public static void ConfigureBody(CharacterBody bodyComponent, string section, string bodyInfoTitle = "")
{
if (string.IsNullOrEmpty(bodyInfoTitle))
{
bodyInfoTitle = ((Object)bodyComponent).name;
}
bodyComponent.baseMaxHealth = BindAndOptions(section, bodyInfoTitle + " Base Max Health", bodyComponent.baseMaxHealth, 0f, 1000f, "levelMaxHealth will be adjusted accordingly (baseMaxHealth * 0.3)", restartRequired: true).Value;
bodyComponent.levelMaxHealth = Mathf.Round(bodyComponent.baseMaxHealth * 0.3f);
bodyComponent.baseRegen = BindAndOptions(section, bodyInfoTitle + " Base Regen", bodyComponent.baseRegen, "levelRegen will be adjusted accordingly (baseRegen * 0.2)", restartRequired: true).Value;
bodyComponent.levelRegen = bodyComponent.baseRegen * 0.2f;
bodyComponent.baseArmor = BindAndOptions(section, bodyInfoTitle + " Armor", bodyComponent.baseArmor, "", restartRequired: true).Value;
bodyComponent.baseDamage = BindAndOptions(section, bodyInfoTitle + " Base Damage", bodyComponent.baseDamage, "pretty much all survivors are 12. If you want to change damage, change damage of the moves instead.\nlevelDamage will be adjusted accordingly (baseDamage * 0.2)", restartRequired: true).Value;
bodyComponent.levelDamage = bodyComponent.baseDamage * 0.2f;
bodyComponent.baseJumpCount = BindAndOptions(section, bodyInfoTitle + " Jump Count", bodyComponent.baseJumpCount, "", restartRequired: true).Value;
}
public static void ConfigureSkillDef(SkillDef skillDef, string section, string skillTitle, bool cooldown = true, bool maxStock = true, bool rechargeStock = false)
{
if (cooldown)
{
skillDef.baseRechargeInterval = BindAndOptions(section, skillTitle + " cooldown", skillDef.baseRechargeInterval, 0f, 20f, "", restartRequired: true).Value;
}
if (maxStock)
{
skillDef.baseMaxStock = BindAndOptions(section, skillTitle + " stocks", skillDef.baseMaxStock, 0f, 100f, "", restartRequired: true).Value;
}
if (rechargeStock)
{
skillDef.rechargeStock = BindAndOptions(section, skillTitle + " recharge stocks", skillDef.baseMaxStock, 0f, 100f, "", restartRequired: true).Value;
}
}
internal static Sprite LoadSpriteFromModFolder(string fileName, bool pointFilter = false)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
string path = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)SillyFalseSonPlugin.instance).Info.Location), fileName);
Texture2D val = new Texture2D(2, 2);
byte[] array = File.ReadAllBytes(path);
ImageConversion.LoadImage(val, array);
((Texture)val).filterMode = (FilterMode)((!pointFilter) ? 1 : 0);
val.Apply();
if (pointFilter)
{
((Texture)val).filterMode = (FilterMode)0;
val.Apply();
}
((Object)val).name = fileName;
((Texture)val).filterMode = (FilterMode)0;
val.Apply();
Rect val2 = default(Rect);
((Rect)(ref val2))..ctor(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height);
Sprite val3 = Sprite.Create(val, val2, new Vector2(0.5f, 0.5f), 16f);
((Object)val3).name = fileName;
return val3;
}
}
namespace SillyFalseSon
{
[BepInPlugin("com.TheTimeSweeper.SillyFalseSon", "Silly False Son", "2.0.0")]
public class SillyFalseSonPlugin : BaseUnityPlugin
{
private const string configSection = "hi";
private ConfigEntry<float> cfg_funnySize;
private ConfigEntry<float> cfg_displaySizeMulti;
private ConfigEntry<float> cfg_hitboxSize;
private ConfigEntry<float> cfg_cameraBack;
private ConfigEntry<float> cfg_cameraHigh;
private ConfigEntry<bool> cfg_dashOnBody;
private ConfigEntry<int> cfg_extraStockDisplays;
private ConfigEntry<bool> cfg_slamMovementTweaks;
internal static SillyFalseSonPlugin instance;
private float _originalClubGroundSlamMinimumDuration;
private void Awake()
{
//IL_0139: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Expected O, but got Unknown
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_0154: Expected O, but got Unknown
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
//IL_0165: Expected O, but got Unknown
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
//IL_0176: Expected O, but got Unknown
instance = this;
cfg_funnySize = Configuration.BindAndOptions("hi", "In-game size", 1.12f, "go nuts", restartRequired: true);
cfg_displaySizeMulti = Configuration.BindAndOptions("hi", "CSS size multiplier", 1f, "vanilla is 0.7 * his in-game size, which is why I thought he was small and made this mod but he's actually kinda big. keeping the big funny size anyways lol", restartRequired: true);
cfg_hitboxSize = Configuration.BindAndOptions("hi", "hitbox size", 9f, "relative to size. if you make him really small you should crank this up. swing effects will not be affected cause I can't be arsed", restartRequired: true);
cfg_cameraBack = Configuration.BindAndOptions("hi", "camera back", 13f, "how far back the camera is pulled dout. default false son is 13. pull it back or forward if you're making him larger or smaller respectively", restartRequired: true);
cfg_cameraHigh = Configuration.BindAndOptions("hi", "camera high", 1f, "how far higher the camera is raised. I forget what default is.", restartRequired: true);
cfg_dashOnBody = Configuration.BindAndOptions("hi", "dash while attacking", defaultValue: true, "puts dash on the body state machine. allowing you to dash while using other abilities", restartRequired: true);
cfg_extraStockDisplays = Configuration.BindAndOptions("hi", "Extra Stock Displays", 20, 0f, 100f, "added stock displays to crosshair for secondary stocks. if it's not a multiple of 4 you're a felon", restartRequired: true);
cfg_slamMovementTweaks = Configuration.BindAndOptions("hi", "Slam movement Tweaks", defaultValue: true, "jump arc of the m1+m2 changes:\ninstantly activate when landing on the ground consistently\ninitial jump arc adjusted\nninitial jump arc no longer affected by attack speed", restartRequired: true);
RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(OnLoad));
if (cfg_slamMovementTweaks.Value)
{
ClubGroundSlam.OnEnter += new hook_OnEnter(ClubGroundSlam_OnEnter);
ClubGroundSlam.OnExit += new hook_OnExit(ClubGroundSlam_OnExit);
PreClubGroundSlam.OnEnter += new hook_OnEnter(PreClubGroundSlam_OnEnter);
PreClubGroundSlam.FixedUpdate += new hook_FixedUpdate(PreClubGroundSlam_FixedUpdate);
}
}
private void PreClubGroundSlam_OnEnter(orig_OnEnter orig, PreClubGroundSlam self)
{
PreClubGroundSlam.upwardVelocity = 22f;
((BaseUnityPlugin)this).Logger.LogWarning((object)PreClubGroundSlam.baseDuration);
orig.Invoke(self);
self.duration = 0.3f;
}
private void PreClubGroundSlam_FixedUpdate(orig_FixedUpdate orig, PreClubGroundSlam self)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
orig.Invoke(self);
((EntityState)self).characterMotor.velocity.y += Physics.gravity.y * 2.5f * Time.deltaTime;
}
private void ClubGroundSlam_OnEnter(orig_OnEnter orig, ClubGroundSlam self)
{
_originalClubGroundSlamMinimumDuration = ClubGroundSlam.minimumDuration;
if (!((EntityState)self).characterMotor.isGrounded)
{
ClubGroundSlam.minimumDuration = 0f;
}
orig.Invoke(self);
}
private void ClubGroundSlam_OnExit(orig_OnExit orig, ClubGroundSlam self)
{
orig.Invoke(self);
ClubGroundSlam.minimumDuration = _originalClubGroundSlamMinimumDuration;
}
private void OnLoad()
{
DoEverything();
}
private void DoEverything()
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: 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)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_0121: Unknown result type (might be due to invalid IL or missing references)
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_0180: Unknown result type (might be due to invalid IL or missing references)
//IL_019e: Unknown result type (might be due to invalid IL or missing references)
//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
//IL_020d: Unknown result type (might be due to invalid IL or missing references)
//IL_0237: Unknown result type (might be due to invalid IL or missing references)
CharacterBody component = BodyCatalog.FindBodyPrefab("FalseSonBody").GetComponent<CharacterBody>();
Transform transform = ((Component)((Component)component).GetComponentInChildren<CharacterModel>()).transform;
transform.localScale = Vector3.one * cfg_funnySize.Value;
transform.Find("ClubHitBox").localScale = new Vector3(1f, 1.1f, 1f) * cfg_hitboxSize.Value;
transform.Find("ClubHitBox").localPosition = new Vector3(0f, 2f, 3f);
SurvivorCatalog.FindSurvivorDefFromBody(((Component)component).gameObject).displayPrefab.transform.GetChild(0).localScale = Vector3.one * cfg_funnySize.Value * cfg_displaySizeMulti.Value;
CharacterCameraParams cameraParams = ((Component)component).GetComponent<CameraTargetParams>().cameraParams;
cameraParams.data.idealLocalCameraPos = BlendableVector3.op_Implicit(new Vector3(0f, cfg_cameraHigh.Value, 0f - cfg_cameraBack.Value));
cameraParams.data.pivotVerticalOffset = BlendableFloat.op_Implicit(1f);
EntityState obj = EntityStateCatalog.InstantiateState(typeof(ClubSwing));
ClubSwing val = (ClubSwing)(object)((obj is ClubSwing) ? obj : null);
GameObject swingEffectPrefab = ((BasicMeleeAttack)val).swingEffectPrefab;
swingEffectPrefab.transform.GetChild(0).localScale = Vector3.one * 0.8f;
swingEffectPrefab.transform.GetChild(0).localPosition = new Vector3(0f, 0f, -2.5f);
swingEffectPrefab = ClubSwing.secondarySwingEffectPrefab;
swingEffectPrefab.transform.GetChild(0).localScale = Vector3.one * 0.8f;
swingEffectPrefab.transform.GetChild(0).localPosition = new Vector3(0f, 1f, -2.5f);
GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/DLC2/FalseSon/FalseSonGroundSlam.prefab").WaitForCompletion();
val2.transform.Find("Debris/Spikes, Small").localScale = new Vector3(3.5f, 3.5f, 2f);
val2.transform.Find("Debris/Particle System").localScale = new Vector3(2f, 2f, 2f);
val2.GetComponent<DestroyOnTimer>().duration = 2f;
if (cfg_dashOnBody.Value)
{
((Component)component).GetComponents<GenericSkill>().First((GenericSkill skill) => skill.skillName == "StepBrothers").skillFamily.variants[0].skillDef.activationStateMachineName = "Body";
}
AddStockStoCrosshair(component);
}
private void AddStockStoCrosshair(CharacterBody funnyGuy)
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: 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_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_010b: Unknown result type (might be due to invalid IL or missing references)
//IL_0110: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
//IL_0171: Unknown result type (might be due to invalid IL or missing references)
if (cfg_extraStockDisplays.Value > 0)
{
Transform transform = PrefabAPI.InstantiateClone(funnyGuy.defaultCrosshairPrefab, ((Object)funnyGuy.defaultCrosshairPrefab).name, false).transform;
CrosshairController component = ((Component)transform).GetComponent<CrosshairController>();
SkillStockSpriteDisplay val = component.skillStockSpriteDisplays[0];
Queue<Transform> queue = new Queue<Transform>();
queue.Enqueue(transform.Find("Holder/TR/TRFill"));
queue.Enqueue(transform.Find("Holder/BR/BRFill"));
queue.Enqueue(transform.Find("Holder/BL/BLFill"));
queue.Enqueue(transform.Find("Holder/TL/TLFill"));
List<SkillStockSpriteDisplay> list = new List<SkillStockSpriteDisplay>();
list.AddRange(component.skillStockSpriteDisplays);
for (int i = 0; i < cfg_extraStockDisplays.Value; i++)
{
Transform val2 = queue.Dequeue();
Transform transform2 = Object.Instantiate<GameObject>(((Component)val2).gameObject, val2.parent).transform;
transform2.localPosition = new Vector3(0f, val2.localPosition.y + 20f, 0f);
list.Add(new SkillStockSpriteDisplay
{
target = ((Component)transform2).gameObject,
skillSlot = val.skillSlot,
requiredSkillDef = val.requiredSkillDef
});
queue.Enqueue(transform2);
}
for (int j = 0; j < list.Count; j++)
{
SkillStockSpriteDisplay value = list[j];
value.minimumStockCountToBeValid = j + 1;
value.maximumStockCountToBeValid = 100;
list[j] = value;
}
component.skillStockSpriteDisplays = list.ToArray();
funnyGuy._defaultCrosshairPrefab = ((Component)transform).gameObject;
}
}
}
}