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 Ping Pong v1.5.0
sonic.dll
Decompiled a month agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("sonic")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("sonic")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("98f6da0c-f28e-4d99-a81d-92f0e99ae946")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] [BepInPlugin("YourModName.PingPong", "Ping Pong Mod", "1.0.0")] public class PingPongPlugin : BaseUnityPlugin { public Transform forceGrabPoint; public float grabVerticalOffset = -0.2f; public float aimVerticalOffset = -5f; public static AssetBundle Bundle; public static GameObject BallPrefab; public static GameObject RacketPrefab; public static PhysicMaterial BounceMat; public static AudioClip BounceSfx; public static PhysicMaterial RacketPhysMat; private void Awake() { //IL_0141: Unknown result type (might be due to invalid IL or missing references) string pluginPath = Paths.PluginPath; string[] array = new string[3] { "", ".bundle", ".assets" }; string text = null; string[] array2 = array; foreach (string text2 in array2) { string[] files = Directory.GetFiles(pluginPath, "pingpong" + text2, SearchOption.AllDirectories); if (files.Length != 0) { text = files[0]; break; } } if (string.IsNullOrEmpty(text)) { ((BaseUnityPlugin)this).Logger.LogError((object)"[PingPong] AssetBundle 'pingpong' not found anywhere in BepInEx/plugins!"); return; } ((BaseUnityPlugin)this).Logger.LogInfo((object)("[PingPong] Loading bundle from: " + text)); Bundle = AssetBundle.LoadFromFile(text); if ((Object)(object)Bundle == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[PingPong] Failed to load bundle!"); return; } BounceSfx = Bundle.LoadAsset<AudioClip>("bounce"); BallPrefab = Bundle.LoadAsset<GameObject>("Valuable Museum GoldTooth1"); RacketPrefab = Bundle.LoadAsset<GameObject>("rracket"); BounceMat = Bundle.LoadAsset<PhysicMaterial>("yeah ball"); RacketPhysMat = Bundle.LoadAsset<PhysicMaterial>("racket"); new Harmony("YourModName.PingPong").PatchAll(); } } [HarmonyPatch(typeof(EnvironmentDirector), "Setup")] public static class SceneModifierPatch { [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "OnCollisionStay")] public static class ImpactDetectorPatch { [HarmonyPrefix] public static bool Prefix(PhysGrabObjectImpactDetector __instance) { if (((Object)((Component)__instance).gameObject).name == "PingPong_Ball" || ((Object)((Component)__instance).gameObject).name == "rracket") { return false; } return true; } } public class BounceHandler : MonoBehaviour { private float _lastTableBounceTime; private AudioSource _source; private Rigidbody _rb; private void Start() { _source = ((Component)this).gameObject.AddComponent<AudioSource>(); _source.clip = PingPongPlugin.BounceSfx; _source.spatialBlend = 1f; _source.maxDistance = 10f; _source.playOnAwake = false; _rb = ((Component)this).GetComponent<Rigidbody>(); } private void FixedUpdate() { //IL_001c: 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_0091: 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_00aa: 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_00b7: 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_00d0: 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_0104: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) RaycastHit val = default(RaycastHit); if (!((Object)(object)_rb == (Object)null) && Physics.Raycast(((Component)this).transform.position, Vector3.down, ref val, 2f) && (((Object)((RaycastHit)(ref val)).transform).name.Contains("Ping Pong Table") || ((Object)(object)((RaycastHit)(ref val)).transform.parent != (Object)null && ((Object)((RaycastHit)(ref val)).transform.parent).name.Contains("Ping Pong Table")))) { Vector3 val2 = ((RaycastHit)(ref val)).point - ((Component)this).transform.position; Vector3 normalized = ((Vector3)(ref val2)).normalized; _rb.AddForce(normalized * 5f, (ForceMode)5); if (_rb.velocity.y > 0f) { _rb.velocity = new Vector3(_rb.velocity.x, _rb.velocity.y * 0.98f, _rb.velocity.z); } } } private void OnCollisionEnter(Collision col) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: 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_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Unknown result type (might be due to invalid IL or missing references) //IL_026b: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) SphereCollider val = ((Component)this).GetComponent<SphereCollider>() ?? ((Component)this).GetComponentInChildren<SphereCollider>(); if ((Object)(object)val != (Object)null && (Object)(object)((Collider)val).sharedMaterial != (Object)(object)PingPongPlugin.BounceMat) { ((Collider)val).sharedMaterial = PingPongPlugin.BounceMat; } Vector3 val2; if ((Object)(object)_source != (Object)null && (Object)(object)_source.clip != (Object)null) { val2 = col.relativeVelocity; float num = Mathf.Clamp01(((Vector3)(ref val2)).magnitude / 8f); _source.PlayOneShot(_source.clip, num); } Transform val3 = col.transform; bool flag = false; while ((Object)(object)val3 != (Object)null) { if (((Object)val3).name.Contains("Ping Pong Table")) { flag = true; break; } val3 = val3.parent; } if (flag && (Object)(object)_rb != (Object)null) { if (Time.time - _lastTableBounceTime < 0.15f) { return; } _lastTableBounceTime = Time.time; val2 = _rb.velocity; float num2 = Mathf.Max(((Vector3)(ref val2)).magnitude, 2f); Vector3 val4 = Vector3.Reflect(_rb.velocity, Vector3.up); _rb.velocity = Vector3.zero; _rb.angularVelocity = Vector3.zero; _rb.velocity = ((Vector3)(ref val4)).normalized * (num2 * 1.5f); float num3 = ((ContactPoint)(ref col.contacts[0])).point.y + 0.05f; ((Component)this).transform.position = new Vector3(((Component)this).transform.position.x, num3, ((Component)this).transform.position.z); Debug.Log((object)"Forward Bounce Executed!"); } if (((Object)col.gameObject).name.Contains("rracket") && (Object)(object)_rb != (Object)null) { val2 = col.relativeVelocity; float magnitude = ((Vector3)(ref val2)).magnitude; float num4 = 1f + magnitude * 0.5f; num4 = Mathf.Clamp(num4, 1f, 3f); Vector3 velocity = _rb.velocity * num4; velocity.y = -1.5f; _rb.velocity = velocity; } try { } catch (Exception) { } } } public class RacketHandler : MonoBehaviour { private PhysGrabObject _physGrab; private Transform _grabPoint; public float aimVerticalOffset = -290f; public float grabVerticalOffset = -0.1f; private bool _wasGrabbedLastFrame = false; private void Start() { _physGrab = ((Component)this).GetComponent<PhysGrabObject>(); _grabPoint = ((Component)this).transform.Find("grab") ?? ((IEnumerable<Transform>)((Component)((Component)this).transform).GetComponentsInChildren<Transform>()).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name == "grab")); } private void Update() { //IL_0051: 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) if (!_physGrab.grabbed || !_physGrab.grabbedLocal) { _wasGrabbedLastFrame = false; return; } if (!_wasGrabbedLastFrame && (Object)(object)_grabPoint != (Object)null) { float num = Vector3.Distance(((Component)this).transform.position, _grabPoint.position); PhysGrabber.instance.OverrideGrabDistance(num); _wasGrabbedLastFrame = true; } UpdateMaster(); } private void UpdateMaster() { //IL_008d: 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) //IL_009a: 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) if (!SemiFunc.IsMasterClientOrSingleplayer() || _physGrab.playerGrabbing.Count <= 0) { return; } bool flag = false; foreach (PhysGrabber item in _physGrab.playerGrabbing) { if (item.isRotating) { flag = true; } } if (!flag) { Quaternion val = Quaternion.Euler(aimVerticalOffset, 0f, 0f); _physGrab.TurnXYZ(val, Quaternion.identity, Quaternion.identity); _physGrab.OverrideTorqueStrength(10f, 0.1f); _physGrab.OverrideAngularDrag(40f, 0.1f); } else { _physGrab.OverrideTorqueStrength(2f, 0.1f); _physGrab.OverrideAngularDrag(20f, 0.1f); } _physGrab.OverrideGrabVerticalPosition(grabVerticalOffset); } } [HarmonyPostfix] public static void Postfix() { //IL_00e9: 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_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) GameObject[] source = Resources.FindObjectsOfTypeAll<GameObject>(); IEnumerable<GameObject> enumerable = source.Where((GameObject o) => ((Object)o).name.Contains("Ping Pong Table")); foreach (GameObject item in enumerable) { string[] array = new string[2] { "Cube.045", "Cube.044" }; string[] array2 = array; foreach (string name in array2) { Transform val = FindRecursive(item.transform, name); if ((Object)(object)val != (Object)null) { Object.Destroy((Object)(object)((Component)val).gameObject); } } IEnumerable<GameObject> enumerable2 = source.Where((GameObject o) => ((Object)o).name.Contains("Beer Bottle")); foreach (GameObject item2 in enumerable2) { if (Vector3.Distance(item2.transform.position, item.transform.position) < 700f) { Object.Destroy((Object)(object)item2); } } if ((Object)(object)PingPongPlugin.RacketPrefab != (Object)null) { GameObject val2 = Object.Instantiate<GameObject>(PingPongPlugin.RacketPrefab, item.transform.position + new Vector3(0f, 0.1f, 0.2f), Quaternion.identity); GameObject val3 = Object.Instantiate<GameObject>(PingPongPlugin.RacketPrefab, item.transform.position + new Vector3(0f, 0.1f, -0.2f), Quaternion.identity); ((Object)val2).name = "rracket"; ((Object)val3).name = "rracket"; val2.AddComponent<RacketHandler>(); val3.AddComponent<RacketHandler>(); ApplyPhysicMaterial(val2, PingPongPlugin.RacketPhysMat); ApplyPhysicMaterial(val3, PingPongPlugin.RacketPhysMat); } if ((Object)(object)PingPongPlugin.BallPrefab != (Object)null) { GameObject val4 = Object.Instantiate<GameObject>(PingPongPlugin.BallPrefab, item.transform.position + new Vector3(0f, 0.2f, 0f), Quaternion.identity); ((Object)val4).name = "PingPong_Ball"; Collider val5 = val4.GetComponent<Collider>() ?? val4.GetComponentInChildren<Collider>(); if ((Object)(object)val5 != (Object)null && (Object)(object)PingPongPlugin.BounceMat != (Object)null) { val5.material = PingPongPlugin.BounceMat; } SphereCollider componentInChildren = val4.GetComponentInChildren<SphereCollider>(); if ((Object)(object)componentInChildren != (Object)null) { ((Collider)componentInChildren).material = PingPongPlugin.BounceMat; } val4.AddComponent<BounceHandler>(); } CleanupStartRoomByProximity(); } } private static void ApplyPhysicMaterial(GameObject obj, PhysicMaterial mat) { if (!((Object)(object)obj == (Object)null) && !((Object)(object)mat == (Object)null)) { Collider component = obj.GetComponent<Collider>(); if ((Object)(object)component != (Object)null) { component.material = mat; } Collider[] componentsInChildren = obj.GetComponentsInChildren<Collider>(true); foreach (Collider val in componentsInChildren) { val.material = mat; } } } private static void CleanupStartRoomByProximity() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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) Module[] source = Resources.FindObjectsOfTypeAll<Module>(); Module val = ((IEnumerable<Module>)source).FirstOrDefault((Func<Module, bool>)((Module m) => ((Object)((Component)m).gameObject).name.Contains("Start"))); if ((Object)(object)val == (Object)null) { return; } Vector3 position = ((Component)val).transform.position; Collider[] array = Physics.OverlapSphere(position, 5f); Collider[] array2 = array; foreach (Collider val2 in array2) { GameObject gameObject = ((Component)val2).gameObject; if (((Object)gameObject).name == "PingPong_Ball" || ((Object)gameObject).name == "rracket" || ((Object)gameObject).name == "Valuable Museum GoldTooth1" || ((Object)gameObject).name == "racket") { Object.Destroy((Object)(object)gameObject); } } } private static Transform FindRecursive(Transform parent, string name) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown foreach (Transform item in parent) { Transform val = item; if (((Object)val).name == name) { return val; } Transform val2 = FindRecursive(val, name); if ((Object)(object)val2 != (Object)null) { return val2; } } return null; } }