The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of Toolgun v1.1.0
net.catcraze777.plugins.toolgunItem.dll
Decompiled 3 weeks agousing 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 BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Microsoft.CodeAnalysis; using PEAKLib.Core; using PEAKLib.Items.UnityEditor; using Photon.Pun; using Photon.Realtime; using UnityEngine; using UnityEngine.UI; using Zorro.Core; using Zorro.Settings; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("net.catcraze777.plugins.toolgunItem")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0")] [assembly: AssemblyProduct("net.catcraze777.plugins.toolgunItem")] [assembly: AssemblyTitle("ToolgunItem")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.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 BepInEx { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class BepInAutoPluginAttribute : Attribute { public BepInAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace BepInEx.Preloader.Core.Patching { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] [Conditional("CodeGeneration")] internal sealed class PatcherAutoPluginAttribute : Attribute { public PatcherAutoPluginAttribute(string? id = null, string? name = null, string? version = null) { } } } namespace ToolgunItem { public class Action_ToolgunFireOnImpact : MonoBehaviour { public float triggerVelocity = 20f; public float triggerChance = 0.2f; public float triggerCooldown = 5f; private float lastFireTime = -5f; private void Awake() { lastFireTime = 0f - triggerCooldown; } private void OnCollisionEnter(Collision collision) { //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) Action_ToolgunReduceUses component = ((Component)this).GetComponent<Action_ToolgunReduceUses>(); int num; if (component == null || !(component.RemainingUses >= 2)) { Action_ToolgunReduceUses component2 = ((Component)this).GetComponent<Action_ToolgunReduceUses>(); num = ((component2 != null && component2.RemainingUses < 0) ? 1 : 0); } else { num = 1; } bool flag = (byte)num != 0; if (flag && !(Time.time - lastFireTime < triggerCooldown)) { int num2; if ((Object)(object)((Component)this).GetComponent<Item>().holderCharacter == (Object)null) { Vector3 relativeVelocity = collision.relativeVelocity; num2 = ((((Vector3)(ref relativeVelocity)).magnitude > triggerVelocity) ? 1 : 0); } else { num2 = 0; } if (((uint)num2 & (flag ? 1u : 0u)) != 0 && Random.value < triggerChance) { lastFireTime = Time.time; ((Component)this).GetComponent<Action_ToolgunSelectItem>().SpawnItem(impactSpawn: true); } } } } public class Action_ToolgunInspectScreen : ItemActionBase { [CompilerGenerated] private sealed class <EnableCameraOverrideWithDelay>d__17 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public float delay; public Action_ToolgunInspectScreen <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <EnableCameraOverrideWithDelay>d__17(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown int num = <>1__state; Action_ToolgunInspectScreen action_ToolgunInspectScreen = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(delay); <>1__state = 1; return true; case 1: <>1__state = -1; if ((Object)(object)action_ToolgunInspectScreen.cameraOverride != (Object)null) { MainCamera.instance.SetCameraOverride(action_ToolgunInspectScreen.cameraOverride); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public Vector3 inspectItemPosition; public Vector3 inspectItemForwardVector; public float cameraZoom = 0.7f; private Vector3 originalItemPosition; private Vector3 originalItemForwardVector; private float originalUsingTime; private GameObject reticlesObject; private CameraOverride cameraOverride; private FovSetting fovSetting; private Coroutine enableCameraCoroutine; public override void OnEnable() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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) //IL_0023: Unknown result type (might be due to invalid IL or missing references) ((ItemActionBase)this).OnEnable(); originalItemPosition = base.item.defaultPos; originalItemForwardVector = base.item.defaultForward; originalUsingTime = base.item.usingTimePrimary; cameraOverride = ((Component)this).GetComponentInChildren<CameraOverride>(); UpdateCameraOverrideFOV(); if (!((Object)(object)GUIManager.instance != (Object)null)) { return; } Transform[] componentsInChildren = ((Component)GUIManager.instance).GetComponentsInChildren<Transform>(); foreach (Transform val in componentsInChildren) { if (((Object)val).name == "Reticles") { reticlesObject = ((Component)val).gameObject; break; } } } public override void Subscribe() { base.item.OnSecondaryStarted = (Action)Delegate.Combine(base.item.OnSecondaryStarted, new Action(StartInspectingScreen)); base.item.OnSecondaryCancelled = (Action)Delegate.Combine(base.item.OnSecondaryCancelled, new Action(StopInspectingScreen)); } public override void Unsubscribe() { base.item.OnSecondaryStarted = (Action)Delegate.Remove(base.item.OnSecondaryStarted, new Action(StartInspectingScreen)); base.item.OnSecondaryCancelled = (Action)Delegate.Remove(base.item.OnSecondaryCancelled, new Action(StopInspectingScreen)); } private void StartInspectingScreen() { enableCameraCoroutine = ((MonoBehaviour)this).StartCoroutine(EnableCameraOverrideWithDelay(0.1f)); UpdateCameraOverrideFOV(); ((MonoBehaviourPun)this).photonView.RPC("RPCStartInspectingScreen", (RpcTarget)0, Array.Empty<object>()); GameObject obj = reticlesObject; if (obj != null) { obj.SetActive(false); } } [PunRPC] private void RPCStartInspectingScreen() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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) base.item.defaultPos = inspectItemPosition; base.item.defaultForward = inspectItemForwardVector; base.item.usingTimePrimary = -1f; } private void StopInspectingScreen() { ((MonoBehaviourPun)this).photonView.RPC("RPCStopInspectingScreen", (RpcTarget)0, Array.Empty<object>()); if (enableCameraCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(enableCameraCoroutine); } if ((Object)(object)cameraOverride != (Object)null) { MainCamera.instance.SetCameraOverride((CameraOverride)null); } GameObject obj = reticlesObject; if (obj != null) { obj.SetActive(true); } } [PunRPC] private void RPCStopInspectingScreen() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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) base.item.defaultPos = originalItemPosition; base.item.defaultForward = originalItemForwardVector; base.item.usingTimePrimary = originalUsingTime; } [IteratorStateMachine(typeof(<EnableCameraOverrideWithDelay>d__17))] private IEnumerator EnableCameraOverrideWithDelay(float delay) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <EnableCameraOverrideWithDelay>d__17(0) { <>4__this = this, delay = delay }; } private void UpdateCameraOverrideFOV() { if ((Object)(object)cameraOverride != (Object)null && SettingsHandler.Instance != null) { if (fovSetting == null) { fovSetting = SettingsHandler.Instance.GetSetting<FovSetting>(); } FovSetting obj = fovSetting; float num = ((obj != null) ? ((FloatSetting)obj).Value : 90f); cameraOverride.fov = num * cameraZoom; } } } public class Action_ToolgunParticles : ItemActionBase { public float particleWidth = 0.8f; public float flattestAngle = 15f; public float sharpestAngle = 70f; public float recoilStrength = 500f; public List<float> particleLineWidths = new List<float>(7) { 0.2f, 0.17f, 0.13f, 0.05f, 0.05f, 0.04f, 0.03f }; private Transform barrelForwardTransform; private Transform shootTrailParticlesTransform; private Transform spawnSpotParticlesTransform; private Transform muzzleFlashParticlesTransform; private AudioSource shootAudio; public override void OnEnable() { ((ItemActionBase)this).OnEnable(); Transform[] componentsInChildren = ((Component)this).GetComponentsInChildren<Transform>(); foreach (Transform val in componentsInChildren) { switch (((Object)val).name) { case "BarrelForwardTransform": barrelForwardTransform = val; break; case "VFX_ShootPath": shootTrailParticlesTransform = val; break; case "VFX_ItemSpawn": spawnSpotParticlesTransform = val; break; case "VFX_MuzzleFlash": muzzleFlashParticlesTransform = val; break; } } AudioSource[] components = ((Component)this).GetComponents<AudioSource>(); foreach (AudioSource val2 in components) { if (((Object)val2.resource).name == "toolgunShot") { shootAudio = val2; } } } public void SpawnParticles() { //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_000c: 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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) Vector3 position = barrelForwardTransform.position; RaycastHit val = default(RaycastHit); if (Physics.Raycast(position, barrelForwardTransform.forward, ref val)) { SpawnParticles(position, ((RaycastHit)(ref val)).point, ((RaycastHit)(ref val)).normal); } } public void SpawnParticles(Vector3 origin, Vector3 destination, Vector3 surfaceNormal) { //IL_0014: 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_0026: Unknown result type (might be due to invalid IL or missing references) ((MonoBehaviourPun)this).photonView.RPC("RPCSpawnParticles", (RpcTarget)0, new object[3] { origin, destination, surfaceNormal }); } [PunRPC] public void RPCSpawnParticles(Vector3 origin, Vector3 destination, Vector3 surfaceNormal) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: 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_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0036: 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) //IL_0063: 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) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: 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_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: 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_010d: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)shootTrailParticlesTransform == (Object)null)) { Vector3 val = destination - origin; float magnitude = ((Vector3)(ref val)).magnitude; GameObject val2 = Object.Instantiate<GameObject>(((Component)shootTrailParticlesTransform).gameObject); val2.transform.position = origin; val2.transform.LookAt(destination); val2.AddComponent<DestroyAfterTime>(); ParticleSystem[] componentsInChildren = val2.GetComponentsInChildren<ParticleSystem>(); foreach (ParticleSystem val3 in componentsInChildren) { ShapeModule shape = val3.shape; ((ShapeModule)(ref shape)).radius = magnitude / 2f; ((ShapeModule)(ref shape)).position = new Vector3(0f, 0f, magnitude / 2f); EmissionModule emission = val3.emission; Burst burst = ((EmissionModule)(ref emission)).GetBurst(0); ((Burst)(ref burst)).count = new MinMaxCurve(magnitude * 2f); ((EmissionModule)(ref emission)).SetBurst(0, burst); val3.Play(); } val2 = Object.Instantiate<GameObject>(((Component)spawnSpotParticlesTransform).gameObject); val2.transform.position = destination + surfaceNormal * 0.05f; val2.transform.LookAt(destination + surfaceNormal); val2.AddComponent<DestroyAfterTime>(); ParticleSystem[] componentsInChildren2 = val2.GetComponentsInChildren<ParticleSystem>(); foreach (ParticleSystem val4 in componentsInChildren2) { val4.Play(); } val2 = Object.Instantiate<GameObject>(((Component)muzzleFlashParticlesTransform).gameObject); val2.transform.position = origin; val2.transform.LookAt(destination); val2.AddComponent<DestroyAfterTime>(); ParticleSystem[] componentsInChildren3 = val2.GetComponentsInChildren<ParticleSystem>(); foreach (ParticleSystem val5 in componentsInChildren3) { val5.Play(); } Rigidbody component = ((Component)this).GetComponent<Rigidbody>(); if (component != null) { component.AddForceAtPosition(-1f * recoilStrength * val2.transform.forward, val2.transform.position, (ForceMode)1); } AudioSource obj = shootAudio; if (obj != null) { obj.Play(); } } } public override void Subscribe() { } public override void Unsubscribe() { } } internal class Destroy : MonoBehaviour { public void Update() { if (((Component)this).transform.childCount <= 0) { Object.Destroy((Object)(object)((Component)this).gameObject); } } } public class Action_ToolgunReduceUses : Action_ReduceUses { public int? RemainingUses => GetRemainingUses(); public override void RunAction() { } public void ReduceUse() { ((Action_ReduceUses)this).RunAction(); UpdatePercentage(); } public void UpdatePercentage() { int? remainingUses = RemainingUses; if (remainingUses.HasValue) { ((ItemActionBase)this).item.SetUseRemainingPercentage(((float)remainingUses.Value - 1f) / ((float)((ItemActionBase)this).item.totalUses - 1f)); } } public int? GetRemainingUses() { OptionableIntItemData data = ((ItemActionBase)this).item.GetData<OptionableIntItemData>((DataEntryKey)2); if (!data.HasData) { return null; } return data.Value; } } public class Action_ToolgunSelectItem : ItemActionBase { [CompilerGenerated] private sealed class <TryAndUpdateIcon>d__16 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Action_ToolgunSelectItem <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TryAndUpdateIcon>d__16(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; Action_ToolgunSelectItem action_ToolgunSelectItem = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if ((Object)(object)action_ToolgunSelectItem.itemSpawner?.SelectedItem == (Object)null) { <>2__current = null; <>1__state = 1; return true; } action_ToolgunSelectItem.UpdateIcon(); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public float maxRange = 30f; public float itemSpawnHeightMultiplier = 0.6f; public float itemSpawnHeightSpacing = 0.3f; public GameObject errorMessagePrefab; private Image itemIconDisplay; private Sprite errorSprite; private ToolgunItemSpawner itemSpawner; private Transform barrelForwardTransform; private Collider collider; private AudioSource errorAudio; private DestroyAfterTimeRestartable errorDestroyTimer; public bool isErrored; private Animation errorAnimation; private T GetComponentByObjectName<T>(string objectName) where T : Component { T[] componentsInChildren = ((Component)this).GetComponentsInChildren<T>(); foreach (T val in componentsInChildren) { if (((Object)(object)val).name == objectName) { return val; } } return default(T); } private void Awake() { itemIconDisplay = GetComponentByObjectName<Image>("IconImage"); errorSprite = itemIconDisplay.sprite; barrelForwardTransform = GetComponentByObjectName<Transform>("BarrelForwardTransform"); itemSpawner = ((Component)this).GetComponent<ToolgunItemSpawner>(); collider = ((Component)this).GetComponentInChildren<Collider>(); AudioSource[] components = ((Component)this).GetComponents<AudioSource>(); foreach (AudioSource val in components) { if (((Object)val.resource).name == "toolgunError") { errorAudio = val; } } } public override void OnEnable() { ((ItemActionBase)this).OnEnable(); } [IteratorStateMachine(typeof(<TryAndUpdateIcon>d__16))] private IEnumerator TryAndUpdateIcon() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TryAndUpdateIcon>d__16(0) { <>4__this = this }; } public void UpdateIcon() { if ((Object)(object)itemSpawner?.SelectedItem != (Object)null) { ((MonoBehaviourPun)this).photonView.RPC("RPCUpdateIcon", (RpcTarget)0, new object[1] { isErrored ? (-1) : itemSpawner.currItemIndex }); } } public void UpdateIconLocal() { RPCUpdateIcon(isErrored ? (-1) : itemSpawner.currItemIndex); } [PunRPC] private void RPCUpdateIcon() { RPCUpdateIcon(null); } [PunRPC] private void RPCUpdateIcon(int? selectedItemIndexNullable = null) { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) int num = (selectedItemIndexNullable.HasValue ? (selectedItemIndexNullable.Value % itemSpawner.currItemList.Count) : itemSpawner.currItemIndex); if (num < 0) { itemIconDisplay.sprite = errorSprite; return; } Texture2D val = itemSpawner.currItemList[num]?.UIData.icon; if (!((Object)(object)val == (Object)null)) { Rect val2 = default(Rect); ((Rect)(ref val2))..ctor(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height); Vector2 val3 = default(Vector2); ((Vector2)(ref val3))..ctor(0.5f, 0.5f); itemIconDisplay.sprite = Sprite.Create(val, val2, val3); } } public void DoErrorEffects(string errorMessage = "", bool setErrorState = true) { ((MonoBehaviourPun)this).photonView.RPC("RPCDoErrorEffects", (RpcTarget)0, new object[2] { errorMessage, setErrorState }); } [PunRPC] private void RPCDoErrorEffects(string errorMessage = "", bool setErrorState = true) { AudioSource obj = errorAudio; if (obj != null) { obj.Play(); } if ((Object)(object)errorMessagePrefab == (Object)null) { return; } if (SettingsManager.displayFakeErrors) { if ((Object)(object)errorAnimation == (Object)null) { if ((Object)(object)GUIManager.instance == (Object)null) { return; } GameObject val = Object.Instantiate<GameObject>(errorMessagePrefab); errorDestroyTimer = val.AddComponent<DestroyAfterTimeRestartable>(); GUIManager instance = GUIManager.instance; Transform[] componentsInChildren = ((Component)instance).GetComponentsInChildren<Transform>(); foreach (Transform val2 in componentsInChildren) { if (((Object)val2).name == "Canvas_HUD") { val.transform.SetParent(val2, false); break; } } errorAnimation = val.GetComponentInChildren<Animation>(); } if (errorAnimation.isPlaying) { errorAnimation.Stop(); } errorAnimation.Play(); errorDestroyTimer.RestartTimer(); if (errorMessage != "") { ToolgunPlugin.Log.LogError((object)errorMessage); } } if (setErrorState) { isErrored = true; itemIconDisplay.sprite = errorSprite; } } public override void Subscribe() { base.item.OnScrolledMouseOnly = (Action<float>)Delegate.Combine(base.item.OnScrolledMouseOnly, new Action<float>(Scrolled)); base.item.OnScrollBackwardPressed = (Action)Delegate.Combine(base.item.OnScrollBackwardPressed, new Action(ScrollLeft)); base.item.OnScrollForwardPressed = (Action)Delegate.Combine(base.item.OnScrollForwardPressed, new Action(ScrollRight)); base.item.OnPrimaryFinishedCast = (Action)Delegate.Combine(base.item.OnPrimaryFinishedCast, new Action(TrySpawnItem)); } public override void Unsubscribe() { base.item.OnScrolledMouseOnly = (Action<float>)Delegate.Remove(base.item.OnScrolledMouseOnly, new Action<float>(Scrolled)); base.item.OnScrollBackwardPressed = (Action)Delegate.Remove(base.item.OnScrollBackwardPressed, new Action(ScrollLeft)); base.item.OnScrollForwardPressed = (Action)Delegate.Remove(base.item.OnScrollForwardPressed, new Action(ScrollRight)); base.item.OnPrimaryFinishedCast = (Action)Delegate.Remove(base.item.OnPrimaryFinishedCast, new Action(TrySpawnItem)); } private void ScrollLeft() { Scrolled(-1f); } private void ScrollRight() { Scrolled(1f); } private void Scrolled(float value) { if (!isErrored) { if (value < 0f) { itemSpawner?.ShiftIndexLeft(); } else if (value > 0f) { itemSpawner?.ShiftIndexRight(); } UpdateIcon(); } } public void TrySpawnItem() { TrySpawnItem(impactSpawn: false); } public void TrySpawnItem(bool impactSpawn = false) { Action_ToolgunReduceUses component = ((Component)this).GetComponent<Action_ToolgunReduceUses>(); if (component != null && component.RemainingUses <= 2) { Action_ToolgunReduceUses component2 = ((Component)this).GetComponent<Action_ToolgunReduceUses>(); if (component2 != null && component2.RemainingUses >= 0) { DoErrorEffects("Unable to use item more than " + ((SettingsManager.toolgunUses == 2) ? "twice" : $"{SettingsManager.toolgunUses} time(s)") + " due to numerical limitations!"); return; } } SpawnItem(impactSpawn); } public void SpawnItem(bool impactSpawn = false) { //IL_002c: 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_0031: Unknown result type (might be due to invalid IL or missing references) //IL_004c: 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_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0053: 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_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0080: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: 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_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0109: 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) bool flag = (Object)(object)base.item.holderCharacter != (Object)null; Vector3 val = (flag ? ((Component)MainCamera.instance).transform.position : barrelForwardTransform.position); Vector3 val2 = (flag ? ((Component)MainCamera.instance).transform.forward : barrelForwardTransform.forward); RaycastHit val3 = default(RaycastHit); bool flag2 = Physics.Raycast(val, val2, ref val3, maxRange, LayerMask.op_Implicit(HelperFunctions.terrainMapMask), (QueryTriggerInteraction)1); if (flag2) { Vector3 point = ((RaycastHit)(ref val3)).point; Vector3 val4 = ((RaycastHit)(ref val3)).normal; Vector3 normalized = ((Vector3)(ref val4)).normalized; Bounds bounds = collider.bounds; val4 = ((Bounds)(ref bounds)).size; float magnitude = ((Vector3)(ref val4)).magnitude; Vector3 position = point + (itemSpawnHeightMultiplier * magnitude + itemSpawnHeightSpacing) * normalized; Quaternion rotation = ((Component)MainCamera.instance).transform.rotation; Quaternion rotation2 = Quaternion.Euler(0f, ((Quaternion)(ref rotation)).eulerAngles.y, 0f); itemSpawner?.SpawnItem(position, rotation2); } else { AudioSource obj = errorAudio; if (obj != null) { obj.Play(); } } if (!impactSpawn) { return; } Action_ToolgunReduceUses component = ((Component)this).GetComponent<Action_ToolgunReduceUses>(); DoErrorEffects("Toolgun hit a wall too hard!", component != null && component.RemainingUses.GetValueOrDefault() == 1); if (flag2) { AudioSource obj2 = errorAudio; if (obj2 != null) { obj2.Stop(); } } } } public class DestroyAfterTimeRestartable : MonoBehaviour { [CompilerGenerated] private sealed class <StartTimer>d__3 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public DestroyAfterTimeRestartable <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <StartTimer>d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown int num = <>1__state; DestroyAfterTimeRestartable destroyAfterTimeRestartable = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(destroyAfterTimeRestartable.time); <>1__state = 1; return true; case 1: <>1__state = -1; Object.Destroy((Object)(object)((Component)destroyAfterTimeRestartable).gameObject); return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public float time = 3f; private Coroutine _myCoroutine; private void Start() { _myCoroutine = ((MonoBehaviour)this).StartCoroutine(StartTimer()); } [IteratorStateMachine(typeof(<StartTimer>d__3))] private IEnumerator StartTimer() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <StartTimer>d__3(0) { <>4__this = this }; } public void RestartTimer() { ((MonoBehaviour)this).StopAllCoroutines(); _myCoroutine = ((MonoBehaviour)this).StartCoroutine(StartTimer()); } } [BepInPlugin("net.catcraze777.plugins.toolgunItem", "ToolgunItem", "1.1.0")] public class ToolgunPlugin : BaseUnityPlugin { private GameObject uiErrorAsset; public const string Id = "net.catcraze777.plugins.toolgunItem"; internal static ManualLogSource Log { get; private set; } public static string Name => "ToolgunItem"; public static string Version => "1.1.0"; public void Awake() { Log = ((BaseUnityPlugin)this).Logger; SettingsManager.InitSettingsManager(((BaseUnityPlugin)this).Config); SettingsManager.LoadConfigBindings(); BundleLoader.LoadBundleWithName((BaseUnityPlugin)(object)this, "toolgunitem.peakbundle", (Action<PeakBundle>)delegate(PeakBundle peakBundle) { //IL_0039: 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_0058: 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_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) UnityItemContent val = peakBundle.LoadAsset<UnityItemContent>("ToolgunContent"); GameObject itemPrefab = val.ItemPrefab; UnityItemContent val2 = peakBundle.LoadAsset<UnityItemContent>("ToolgunAdminContent"); GameObject itemPrefab2 = val2.ItemPrefab; uiErrorAsset = peakBundle.LoadAsset<GameObject>("UI_GModError"); AddScriptsToToolgun(itemPrefab, SettingsManager.itemSpawnPool, isAdminSpawner: false, SettingsManager.itemRarity, SettingsManager.toolgunUses); LootData component = itemPrefab.GetComponent<LootData>(); component.Rarity = SettingsManager.toolgunRarity; component.spawnLocations = SettingsManager.toolgunSpawnPool; AddScriptsToToolgun(itemPrefab2, (SpawnPool)0, isAdminSpawner: true, (Rarity)4); itemPrefab2.GetComponent<Action_ToolgunSelectItem>().maxRange = 999999f; peakBundle.Mod.RegisterContent(); }); Log.LogInfo((object)"Toolgun item is loaded!"); AddLocalizedText("NAME_TOOLGUN", "TOOLGUN"); AddLocalizedText("NAME_TOOLGUNADMIN", "ADMIN'S TOOLGUN"); AddLocalizedText("SELECT ITEM", "select item"); AddLocalizedText("VIEW SCREEN", "view screen"); AddLocalizedText("SPAWN ITEM", "spawn item"); Log.LogInfo((object)"Plugin net.catcraze777.plugins.toolgunItem is loaded!"); } private void AddScriptsToToolgun(GameObject toolgunPrefab, SpawnPool itemPool, bool isAdminSpawner = false, Rarity rarityLimit = 4, uint itemUses = 2u) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_0065: 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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) toolgunPrefab.AddComponent<Action_ToolgunParticles>(); toolgunPrefab.AddComponent<Action_ToolgunFireOnImpact>(); Action_ToolgunSelectItem action_ToolgunSelectItem = toolgunPrefab.AddComponent<Action_ToolgunSelectItem>(); action_ToolgunSelectItem.errorMessagePrefab = uiErrorAsset; Action_ToolgunReduceUses action_ToolgunReduceUses = toolgunPrefab.AddComponent<Action_ToolgunReduceUses>(); ((ItemAction)action_ToolgunReduceUses).OnCastFinished = true; Action_ToolgunInspectScreen action_ToolgunInspectScreen = toolgunPrefab.AddComponent<Action_ToolgunInspectScreen>(); action_ToolgunInspectScreen.inspectItemPosition = new Vector3(0f, 0.25f, 0.7f); Vector3 val = new Vector3(0f, 1f, 1f); action_ToolgunInspectScreen.inspectItemForwardVector = ((Vector3)(ref val)).normalized; ToolgunItemSpawner toolgunItemSpawner = toolgunPrefab.AddComponent<ToolgunItemSpawner>(); toolgunItemSpawner.itemPool = itemPool; toolgunItemSpawner.isAdminSpawner = isAdminSpawner; toolgunItemSpawner.rarityLimit = (Rarity)(isAdminSpawner ? 6 : ((int)rarityLimit)); toolgunPrefab.GetComponent<Item>().totalUses = (isAdminSpawner ? (-1) : ((int)(itemUses + 2))); } public static void AddLocalizedText(string entryName, string entryText) { LocalizedText.mainTable[entryName] = new List<string>(15) { entryText, entryText, entryText, entryText, entryText, entryText, entryText, entryText, entryText, entryText, entryText, entryText, entryText, entryText, entryText }; } } public class SettingsManager { public static ConfigFile config; public static ConfigEntry<Rarity> toolgunRarityConfig; public static ConfigEntry<SpawnPool> toolgunSpawnPoolConfig; public static ConfigEntry<uint> toolgunUsesConfig; public static ConfigEntry<SpawnPool> itemSpawnPoolConfig; public static ConfigEntry<Rarity> itemRarityConfig; public static ConfigEntry<bool> displayFakeErrorsConfig; public static Rarity toolgunRarity { get { //IL_000b: Unknown result type (might be due to invalid IL or missing references) return (Rarity)(((??)toolgunRarityConfig?.Value) ?? 4); } private set { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (toolgunRarityConfig != null) { toolgunRarityConfig.Value = value; } } } public static SpawnPool toolgunSpawnPool { get { //IL_000f: Unknown result type (might be due to invalid IL or missing references) return (SpawnPool)(((??)toolgunSpawnPoolConfig?.Value) ?? 16384); } private set { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (toolgunSpawnPoolConfig != null) { toolgunSpawnPoolConfig.Value = value; } } } public static uint toolgunUses { get { return toolgunUsesConfig?.Value ?? 2; } private set { if (toolgunUsesConfig != null) { toolgunUsesConfig.Value = value; } } } public static SpawnPool itemSpawnPool { get { //IL_000f: Unknown result type (might be due to invalid IL or missing references) return (SpawnPool)(((??)itemSpawnPoolConfig?.Value) ?? 1024); } private set { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (itemSpawnPoolConfig != null) { itemSpawnPoolConfig.Value = value; } } } public static Rarity itemRarity { get { //IL_000b: Unknown result type (might be due to invalid IL or missing references) return (Rarity)(((??)itemRarityConfig?.Value) ?? 4); } private set { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (itemRarityConfig != null) { itemRarityConfig.Value = value; } } } public static bool displayFakeErrors { get { return displayFakeErrorsConfig?.Value ?? true; } private set { if (displayFakeErrorsConfig != null) { displayFakeErrorsConfig.Value = value; } } } public static void InitSettingsManager(ConfigFile inputConfig) { config = inputConfig; } public static void LoadConfigBindings() { //IL_0017: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) if (config != null) { toolgunRarityConfig = config.Bind<Rarity>("General", "Toolgun Rarity", toolgunRarity, "The rarity of the toolgun. Rarities are assigned a weight used to influence rng pulls, with lower being rarer. Common: 100, Uncommon: 50, Rare: 30, Epic: 20, Legendary: 15, Mythic: 5, RidiculouslyRare: 1"); toolgunSpawnPoolConfig = config.Bind<SpawnPool>("General", "Toolgun Spawn Pool", toolgunSpawnPool, "The spawn/loot pool the toolgun will be added to."); toolgunUsesConfig = config.Bind<uint>("General", "Toolgun Uses", toolgunUses, "How many items the toolgun can spawn before breaking."); itemSpawnPoolConfig = config.Bind<SpawnPool>("General", "Toolgun Item Spawn Pool", itemSpawnPool, "The spawn/loot pool the toolgun can spawn items from."); itemRarityConfig = config.Bind<Rarity>("General", "Toolgun Item Rarity Limit", itemRarity, "Maximum rarity items the toolgun can spawn. If an item is rarer than what's specified here, it will not appear in the toolgun spawn menu."); displayFakeErrorsConfig = config.Bind<bool>("General", "Display Fake Errors", displayFakeErrors, "Display the error textbox joke or not."); } } } public class ToolgunItemSpawner : MonoBehaviour { public SpawnPool itemPool; public Rarity rarityLimit = (Rarity)6; public List<Item> currItemList; public bool isAdminSpawner; public Item? SelectedItem { get { if (currItemList == null || currItemList.Count <= 0) { return null; } return currItemList[currItemIndex]; } } public int currItemIndex { get; private set; } private void Awake() { if (!PhotonNetwork.IsMasterClient) { ((Component)this).GetComponent<PhotonView>().RPC("RPCRequestSpawnSettings", (RpcTarget)2, Array.Empty<object>()); } else { UpdateItemPool(); } } [PunRPC] internal void RPCRequestSpawnSettings(PhotonMessageInfo info) { //IL_0000: 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_0028: Unknown result type (might be due to invalid IL or missing references) Player sender = info.Sender; ((Component)this).GetComponent<PhotonView>().RPC("RPCSetSpawnSettings", sender, new object[3] { SettingsManager.itemSpawnPool, SettingsManager.itemRarity, ((Component)this).GetComponent<Item>().totalUses }); } [PunRPC] internal void RPCSetSpawnSettings(SpawnPool itemPool, Rarity rarityLimit, int originalUses) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) this.itemPool = itemPool; this.rarityLimit = rarityLimit; Item component = ((Component)this).GetComponent<Item>(); component.totalUses = originalUses; UpdateItemPool(); } public void UpdateItemPool() { //IL_004c: 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_0053: 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_0059: 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_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) currItemList = new List<Item>(); if (isAdminSpawner) { List<Item> objects = ((DatabaseAsset<ItemDatabase, Item>)(object)SingletonAsset<ItemDatabase>.Instance).Objects; currItemList.AddRange(objects); } else { foreach (SpawnPool value in Enum.GetValues(typeof(SpawnPool))) { if ((itemPool & value) == 0) { continue; } foreach (Item item in LootData.GetAllItemsInPool(value)) { if (((Component)item).GetComponent<LootData>().Rarity <= rarityLimit) { currItemList.Add(item); } } } } currItemList = currItemList.Distinct().ToList(); currItemList.Sort((Item x, Item y) => x.UIData.itemName.CompareTo(y.UIData.itemName)); if (currItemList.Count > 0) { currItemIndex = Random.Range(0, currItemList.Count); } ((Component)this).GetComponent<Action_ToolgunSelectItem>()?.UpdateIconLocal(); } public void ShiftItemIndex(int offset) { if (currItemList.Count > 0) { currItemIndex += offset; currItemIndex %= currItemList.Count; while (currItemIndex < 0) { currItemIndex += currItemList.Count; } } } public void ShiftIndexLeft() { ShiftItemIndex(-1); } public void ShiftIndexRight() { ShiftItemIndex(1); } public void SpawnItem() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) SpawnItem(((Component)this).transform.position, ((Component)this).transform.rotation); } public void SpawnItem(Vector3 position, Quaternion rotation) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) SpawnItem(null, position, rotation); } public void SpawnItem(string? itemName, Vector3 position, Quaternion rotation) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (itemName == null) { Item? selectedItem = SelectedItem; itemName = ((selectedItem != null) ? ((Object)((Component)selectedItem).gameObject).name : null); } if (!((Object)(object)SelectedItem == (Object)null)) { ((Component)this).GetComponent<PhotonView>().RPC("RPCSpawnItemMaster", (RpcTarget)2, new object[3] { itemName, position, rotation }); ((Component)this).GetComponent<Action_ToolgunParticles>()?.SpawnParticles(); ((Component)this).GetComponent<Action_ToolgunReduceUses>().ReduceUse(); } } [PunRPC] private void RPCSpawnItemMaster(string itemName, Vector3 position, Quaternion rotation) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) GameObject val = PhotonNetwork.InstantiateItemRoom(itemName, position, rotation); val.GetComponent<Item>().SetKinematicNetworked(false); ItemCooking component = ((Component)this).GetComponent<ItemCooking>(); if (!((Object)(object)component != (Object)null)) { return; } for (int i = 0; i < component.timesCookedLocal; i++) { ItemCooking component2 = val.GetComponent<ItemCooking>(); if (component2 != null) { component2.FinishCooking(); } } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }