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 SolPlushMod v4.0.2
SolItem.dll
Decompiled 5 days agousing 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.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using REPOLib.Modules; using UnityEngine; using UnityEngine.Events; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("Autodesk.Fbx")] [assembly: IgnoresAccessChecksTo("Discord.Sdk")] [assembly: IgnoresAccessChecksTo("Domain_Reload")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("FbxBuildTestAssets")] [assembly: IgnoresAccessChecksTo("Klattersynth")] [assembly: IgnoresAccessChecksTo("Photon3Unity3D")] [assembly: IgnoresAccessChecksTo("PhotonChat")] [assembly: IgnoresAccessChecksTo("PhotonRealtime")] [assembly: IgnoresAccessChecksTo("PhotonUnityNetworking")] [assembly: IgnoresAccessChecksTo("PhotonUnityNetworking.Utilities")] [assembly: IgnoresAccessChecksTo("PhotonVoice.API")] [assembly: IgnoresAccessChecksTo("PhotonVoice")] [assembly: IgnoresAccessChecksTo("PhotonVoice.PUN")] [assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime.Public")] [assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Attributes")] [assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Modules.Unity.Addressables")] [assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Modules.UnityLocalization")] [assembly: IgnoresAccessChecksTo("Sirenix.Serialization.Config")] [assembly: IgnoresAccessChecksTo("Sirenix.Serialization")] [assembly: IgnoresAccessChecksTo("Sirenix.Utilities")] [assembly: IgnoresAccessChecksTo("Unity.Addressables")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.InternalAPIEngineBridge.013")] [assembly: IgnoresAccessChecksTo("Unity.Localization")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.MemoryProfiler")] [assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.ResourceManager")] [assembly: IgnoresAccessChecksTo("Unity.ScriptableBuildPipeline")] [assembly: IgnoresAccessChecksTo("Unity.Splines")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Antlr3.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Core")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Flow")] [assembly: IgnoresAccessChecksTo("Unity.VisualScripting.State")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("websocket-sharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Marlin404")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("SolItem")] [assembly: AssemblyTitle("SolItem")] [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.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; } } [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 SolItem { [BepInPlugin("Marlin404.SolItem", "SolItem", "4.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class SolItem : BaseUnityPlugin { internal static SolItem Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); AssetBundle val = AssetBundle.LoadFromFile(Path.Combine(directoryName, "solplush.assets")); GameObject val2 = val.LoadAsset<GameObject>("Valuable Sol"); GameObject val3 = val.LoadAsset<GameObject>("Valuable SolChat"); GameObject val4 = val.LoadAsset<GameObject>("Valuable SolCrystal"); GameObject val5 = val.LoadAsset<GameObject>("Valuable SolChatBig"); GameObject val6 = val.LoadAsset<GameObject>("Valuable SolCrystalBlue"); GameObject val7 = val.LoadAsset<GameObject>("Valuable SolCrystalGreen"); GameObject val8 = val.LoadAsset<GameObject>("Valuable SolCrystalYellow"); GameObject val9 = val.LoadAsset<GameObject>("Valuable SolChibi"); Valuables.RegisterValuable(val2); Valuables.RegisterValuable(val3); Valuables.RegisterValuable(val4); Valuables.RegisterValuable(val5); Valuables.RegisterValuable(val6); Valuables.RegisterValuable(val7); Valuables.RegisterValuable(val8); Valuables.RegisterValuable(val9); GameObject val10 = val.LoadAsset<GameObject>("Valuable SolChat1"); Valuables.RegisterValuable(val10); GameObject val11 = val.LoadAsset<GameObject>("Valuable SolChat2"); Valuables.RegisterValuable(val11); } internal void Patch() { //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_0021: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void Update() { } } public class SolItemTrap : Trap { private enum State { Idle, Active } public enum SoundType { Pickup, HurtLight, HurtMedium, HurtHeavy, TailBreak, Destroyed } private PhysGrabObject physgrabobject; [Space] [Header("Sol Plush Components")] public GameObject? leftEye; public GameObject? rightEye; public GameObject? leftPupil; public GameObject? rightPupil; public bool doChatPhrases; public List<string> phrases = new List<string>(); private float coolDownUntilNextSentence = 3f; private string playerName = "[playerName]"; private State currentState; private Rigidbody? rb; private ParticleScriptExplosion particleScriptExplosion; private bool tailBroken; private bool eyeTracking; private PlayerAvatar lastPlayerGrabbed; private bool prevUpdateGrabbed; public float playerPupilDilationSize = 3f; [Space] public Transform? Center; public bool changePitch; [Space] public bool hourGlass; public bool speed; public bool shrink; public bool heal; [Space] [Header("Sounds")] public Sound? pickup; public Sound? hurtLight; public Sound? hurtMedium; public Sound? hurtHeavy; public Sound? destroyed; private DateTime lastTimeCalled; private DateTime lastTimeHeld; [Space] [Header("Death Objects")] public GameObject? spawnOnDeath; public int deathSpawnMinCount = 1; public int deathSpawnCount = 1; public bool deathSpawnCountRandom = false; public override void Start() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0057: 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) ((Trap)this).Start(); rb = ((Component)this).GetComponent<Rigidbody>(); physgrabobject = ((Component)this).GetComponent<PhysGrabObject>(); particleScriptExplosion = ((Component)this).GetComponent<ParticleScriptExplosion>(); leftPupil.transform.localScale = Vector3.one * 2f; rightPupil.transform.localScale = Vector3.one * 2f; } public override void Update() { if (base.physGrabObject.grabbedLocal) { PlayerAvatar instance = PlayerAvatar.instance; if (playerPupilDilationSize != 1f) { instance.OverridePupilSize(playerPupilDilationSize, 4, 1f, 1f, 5f, 0.5f, 0.1f); } } if (doChatPhrases && SemiFunc.IsMultiplayer()) { switch (currentState) { case State.Idle: StateIdle(); break; case State.Active: StateActive(); break; } } if (hourGlass) { foreach (PhysGrabber item in base.physGrabObject.playerGrabbing) { if (Object.op_Implicit((Object)(object)item) && !item.isLocal) { item.playerAvatar.voiceChat.OverridePitch(0.65f, 1f, 2f, 0.1f, 0f, 0f); } } if (SemiFunc.IsMasterClientOrSingleplayer()) { base.physGrabObject.OverrideDrag(20f, 0.1f); base.physGrabObject.OverrideAngularDrag(40f, 0.1f); } if (base.physGrabObject.grabbedLocal) { PlayerAvatar instance2 = PlayerAvatar.instance; if (Object.op_Implicit((Object)(object)instance2.voiceChat)) { instance2.voiceChat.OverridePitch(0.65f, 1f, 2f, 0.1f, 0f, 0f); } instance2.OverridePupilSize(3f, 4, 1f, 1f, 5f, 0.5f, 0.1f); PlayerController.instance.OverrideSpeed(0.5f, 0.1f); PlayerController.instance.OverrideLookSpeed(0.5f, 2f, 1f, 0.1f); PlayerController.instance.OverrideAnimationSpeed(0.2f, 1f, 2f, 0.1f); PlayerController.instance.OverrideTimeScale(0.1f, 0.1f); base.physGrabObject.OverrideTorqueStrength(0.6f, 0.1f); CameraZoom.Instance.OverrideZoomSet(50f, 0.1f, 0.5f, 1f, ((Component)this).gameObject, 0); PostProcessing.Instance.SaturationOverride(50f, 0.1f, 0.5f, 0.1f, ((Component)this).gameObject); } } if (speed) { foreach (PhysGrabber item2 in base.physGrabObject.playerGrabbing) { if (Object.op_Implicit((Object)(object)item2) && !item2.isLocal) { item2.playerAvatar.voiceChat.OverridePitch(1.35f, 2f, 1f, 0.1f, 0f, 0f); } } if (base.physGrabObject.grabbedLocal) { PlayerAvatar instance3 = PlayerAvatar.instance; if (Object.op_Implicit((Object)(object)instance3.voiceChat)) { instance3.voiceChat.OverridePitch(1.8f, 1f, 2f, 0.1f, 0f, 0f); } instance3.OverridePupilSize(0.3f, 4, 1f, 1f, 5f, 0.5f, 0.1f); PlayerController.instance.OverrideSpeed(2f, 0.1f); base.physGrabObject.OverrideTorqueStrength(2f, 0.1f); PlayerController.instance.OverrideAnimationSpeed(2f, 2f, 1f, 0.1f); } } if (shrink) { } ((Trap)this).Update(); } private void FixedUpdate() { //IL_00b5: 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_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) PhysGrabObject component = ((Component)this).GetComponent<PhysGrabObject>(); PlayerAvatar lastPlayerGrabbing = component.lastPlayerGrabbing; if (component.grabbed && !prevUpdateGrabbed) { prevUpdateGrabbed = true; PlayPickupSound(); } else if (!component.grabbed && prevUpdateGrabbed) { prevUpdateGrabbed = false; lastTimeHeld = DateTime.Now; } if (eyeTracking) { if ((Object)(object)lastPlayerGrabbing != (Object)null && (Object)(object)lastPlayerGrabbing != (Object)(object)lastPlayerGrabbed) { lastPlayerGrabbed = lastPlayerGrabbing; } if ((Object)(object)lastPlayerGrabbed != (Object)null) { Vector3 position = ((Component)lastPlayerGrabbed).transform.position; bool flag = true; position.y = lastPlayerGrabbed.PlayerVisionTarget.TargetPosition; rightEye.transform.LookAt(position); leftEye.transform.LookAt(position); } } } private void StateIdle() { //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) if (coolDownUntilNextSentence > 0f && base.physGrabObject.grabbed) { coolDownUntilNextSentence -= Time.deltaTime; } else { if (!Object.op_Implicit((Object)(object)PhysGrabber.instance) || !PhysGrabber.instance.grabbed || !Object.op_Implicit((Object)(object)PhysGrabber.instance.grabbedPhysGrabObject) || !((Object)(object)PhysGrabber.instance.grabbedPhysGrabObject == (Object)(object)base.physGrabObject)) { return; } bool flag = false; if (!SemiFunc.IsMultiplayer()) { playerName = "Sol"; flag = true; } else { List<PlayerAvatar> list = SemiFunc.PlayerGetAllPlayerAvatarWithinRange(10f, ((Component)PhysGrabber.instance).transform.position, false, default(LayerMask)); PlayerAvatar val = null; float num = float.MaxValue; foreach (PlayerAvatar item in list) { if (!((Object)(object)item == (Object)(object)PlayerAvatar.instance)) { float num2 = Vector3.Distance(((Component)PhysGrabber.instance).transform.position, ((Component)item).transform.position); if (num2 < num) { num = num2; val = item; } } } flag = true; if ((Object)(object)val != (Object)null) { playerName = val.playerName; } else { playerName = "Sol"; } } if (flag) { string text = GenerateAffectionateSentence(); currentState = State.Active; Color val2 = default(Color); ((Color)(ref val2))..ctor(1f, 0.3f, 0.6f, 1f); ChatManager.instance.PossessChatScheduleStart(10); ChatManager.instance.PossessChat((PossessChatID)1, text, 1f, val2, 0f, false, 0, (UnityEvent)null); ChatManager.instance.PossessChatScheduleEnd(); } } } private string GenerateAffectionateSentence() { string text = "Sol really stinks"; if (phrases.Count > 0) { text = phrases[Random.Range(0, phrases.Count)]; } string text2 = text.Replace("{playerName}", playerName); return char.ToUpper(text2[0]) + text2.Substring(1); } private void StateActive() { if (PhysGrabber.instance.grabbed && Object.op_Implicit((Object)(object)PhysGrabber.instance.grabbedPhysGrabObject) && (Object)(object)PhysGrabber.instance.grabbedPhysGrabObject != (Object)(object)base.physGrabObject) { currentState = State.Idle; coolDownUntilNextSentence = Random.Range(5f, 15f); } else if (!ChatManager.instance.StateIsPossessed()) { currentState = State.Idle; coolDownUntilNextSentence = Random.Range(5f, 15f); } } public void StartEyeTracking() { eyeTracking = true; } public void PlayPickupSound() { SoundManager(SoundType.Pickup); } public void PlayHurtSound() { if ((DateTime.Now - lastTimeHeld).TotalSeconds < 3.0) { SoundManager(SoundType.HurtLight); } } public void PlayHurtSoundMedium() { SoundManager(SoundType.HurtMedium); } public void PlayHurtSoundHeavy() { SoundManager(SoundType.HurtHeavy); } public void TrapStop() { //IL_002d: 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_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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) SoundManager(SoundType.Destroyed); SpawnOnBreak(); if (!heal) { return; } List<PlayerAvatar> list = SemiFunc.PlayerGetAllPlayerAvatarWithinRange(3f, ((Component)PhysGrabber.instance).transform.position, false, default(LayerMask)); PlayerAvatar val = null; foreach (PlayerAvatar item in list) { if (!((Object)(object)item == (Object)(object)PlayerAvatar.instance)) { float num = Vector3.Distance(((Component)PhysGrabber.instance).transform.position, ((Component)item).transform.position); item.playerHealth.Heal((int)(num * 10f), true); } } } private void SoundManager(SoundType SoundNum) { //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_0111: 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_017f: Unknown result type (might be due to invalid IL or missing references) DateTime now = DateTime.Now; if ((now - lastTimeCalled).TotalSeconds < 0.05) { try { if (SoundNum == SoundType.Pickup) { pickup.Stop(); } if (SoundNum == SoundType.HurtLight) { hurtLight.Stop(); } if (SoundNum >= SoundType.HurtMedium) { hurtMedium.Stop(); } if (SoundNum >= SoundType.HurtHeavy) { hurtHeavy.Stop(); } } catch (Exception) { } } if ((now - lastTimeCalled).TotalSeconds > 3.0) { if (SoundNum == SoundType.Pickup) { pickup.Play(base.physGrabObject.centerPoint, 1f, 1f, 1f, 1f); } if (SoundNum == SoundType.HurtLight) { hurtLight.Play(base.physGrabObject.centerPoint, 1f, 1f, 1f, 1f); } if (SoundNum == SoundType.HurtMedium) { hurtMedium.Play(base.physGrabObject.centerPoint, 1f, 1f, 1f, 1f); } if (SoundNum == SoundType.HurtHeavy) { hurtHeavy.Play(base.physGrabObject.centerPoint, 1f, 1f, 1f, 1f); } lastTimeCalled = now; } if (SoundNum == SoundType.Destroyed) { destroyed.Play(base.physGrabObject.centerPoint, 1f, 1f, 1f, 1f); lastTimeCalled = now; } } public void SpawnOnBreak() { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_005b: 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_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: 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_00e2: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)spawnOnDeath != (Object)null)) { return; } int num = deathSpawnCount; if (deathSpawnCountRandom) { num = Random.Range(deathSpawnMinCount, deathSpawnCount); } for (int i = 0; i < num; i++) { GameObject val = (SemiFunc.IsMultiplayer() ? PhotonNetwork.InstantiateRoomObject("Valuables/" + ((Object)spawnOnDeath).name, ((Component)this).transform.position, Quaternion.identity, (byte)0, (object[])null) : Object.Instantiate<GameObject>(spawnOnDeath, ((Component)this).transform.position, Quaternion.identity)); if ((Object)(object)val != (Object)null) { rb = val.GetComponent<Rigidbody>(); Vector3 onUnitSphere = Random.onUnitSphere; onUnitSphere.y = Mathf.Abs(onUnitSphere.y); rb.AddForce(onUnitSphere * 10f, (ForceMode)1); } } } } }