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 PaintedUtils v1.1.0
PaintedUtils.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; 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.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using REPOLib.Modules; using REPOLib.Objects; using UnityEngine; using UnityEngine.AI; using UnityEngine.Events; using UnityEngine.Rendering.PostProcessing; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("Autodesk.Fbx")] [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")] [assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime.Public")] [assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Attributes")] [assembly: IgnoresAccessChecksTo("Sirenix.Serialization.Config")] [assembly: IgnoresAccessChecksTo("Sirenix.Serialization")] [assembly: IgnoresAccessChecksTo("Sirenix.Utilities")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [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: AssemblyCompany("PaintedThornStudios")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Utility Mod for REPO")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0+b146dd2fb175251d2e279618d7cbe678063ab8e2")] [assembly: AssemblyProduct("PaintedUtils")] [assembly: AssemblyTitle("PaintedUtils")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/yourusername/PaintedUtils.git")] [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 PaintedThornStudios.PaintedUtils { public class AssetBundleUtil { public static AssetBundle LoadAssetBundle(BaseUnityPlugin modInstance, string bundleName, ManualLogSource logger) { string directoryName = Path.GetDirectoryName(modInstance.Info.Location); string text = Path.Combine(directoryName, bundleName + ".bundle"); AssetBundle val = AssetBundle.LoadFromFile(text); if ((Object)(object)val == (Object)null) { logger.LogError((object)("Failed to load bundle from " + text)); return null; } return val; } public static void FixAudioMixerGroups(AssetBundle bundle, ManualLogSource logger) { if ((Object)(object)bundle == (Object)null) { return; } string[] allAssetNames = bundle.GetAllAssetNames(); foreach (string text in allAssetNames) { GameObject val = bundle.LoadAsset<GameObject>(text); if ((Object)(object)val == (Object)null) { continue; } AudioSource[] componentsInChildren = val.GetComponentsInChildren<AudioSource>(true); AudioSource[] array = componentsInChildren; foreach (AudioSource val2 in array) { if ((Object)(object)val2.outputAudioMixerGroup == (Object)null) { logger.LogWarning((object)("AudioSource in " + text + " has no mixer group assigned")); } } } } } public class EnemyReflectionUtil { public static EnemyNavMeshAgent GetEnemyNavMeshAgent(Enemy enemy) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown Type type = ((object)enemy).GetType(); FieldInfo field = type.GetField("NavMeshAgent", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (EnemyNavMeshAgent)field.GetValue(enemy); } Debug.LogError((object)"NavMeshAgent field not found!"); return null; } public static EnemyRigidbody GetEnemyRigidbody(Enemy enemy) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown Type type = ((object)enemy).GetType(); FieldInfo field = type.GetField("Rigidbody", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (EnemyRigidbody)field.GetValue(enemy); } Debug.LogError((object)"Rigidbody field not found!"); return null; } public static EnemyParent GetEnemyParent(Enemy enemy) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown Type type = ((object)enemy).GetType(); FieldInfo field = type.GetField("EnemyParent", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (EnemyParent)field.GetValue(enemy); } Debug.LogError((object)"EnemyParent field not found!"); return null; } public static EnemyVision GetEnemyVision(Enemy enemy) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown Type type = ((object)enemy).GetType(); FieldInfo field = type.GetField("Vision", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (EnemyVision)field.GetValue(enemy); } Debug.LogError((object)"Vision field not found!"); return null; } public static EnemyStateInvestigate GetEnemyStateInvestigate(Enemy enemy) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown Type type = ((object)enemy).GetType(); FieldInfo field = type.GetField("StateInvestigate", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (EnemyStateInvestigate)field.GetValue(enemy); } Debug.LogError((object)"StateInvestigate field not found!"); return null; } public static bool IsEnemyJumping(Enemy enemy) { Type type = ((object)enemy).GetType(); FieldInfo field = type.GetField("Jump", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { Type fieldType = field.FieldType; FieldInfo field2 = fieldType.GetField("jumping", BindingFlags.Instance | BindingFlags.NonPublic); if (field2 != null) { return (bool)field2.GetValue(field.GetValue(enemy)); } Debug.LogError((object)"Jumping field not found!"); return false; } Debug.LogError((object)"Jump field not found!"); return false; } public static bool IsPlayerDisabled(PlayerAvatar playerTarget) { Type type = ((object)playerTarget).GetType(); FieldInfo field = type.GetField("isDisabled", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (bool)field.GetValue(playerTarget); } Debug.LogError((object)"isDisabled field not found!"); return false; } public static Vector3 GetAgentVelocity(EnemyNavMeshAgent agent) { //IL_003d: 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_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) Type type = ((object)agent).GetType(); FieldInfo field = type.GetField("AgentVelocity", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (Vector3)field.GetValue(agent); } Debug.LogError((object)"AgentVelocity field not found!"); return Vector3.zero; } public static Vector3 GetOnInvestigateTriggeredPosition(EnemyStateInvestigate investigate) { //IL_003d: 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_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) Type type = ((object)investigate).GetType(); FieldInfo field = type.GetField("onInvestigateTriggeredPosition", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (Vector3)field.GetValue(investigate); } Debug.LogError((object)"onInvestigateTriggeredPosition field not found!"); return Vector3.zero; } public static PlayerAvatar GetVisionTriggeredPlayer(EnemyVision vision) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown Type type = ((object)vision).GetType(); FieldInfo field = type.GetField("onVisionTriggeredPlayer", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (PlayerAvatar)field.GetValue(vision); } Debug.LogError((object)"onVisionTriggeredPlayer field not found!"); return null; } public static float GetNotMovingTimer(EnemyRigidbody rb) { Type type = ((object)rb).GetType(); FieldInfo field = type.GetField("notMovingTimer", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { return (float)field.GetValue(rb); } Debug.LogError((object)"NotMovingTimer field not found!"); return 0f; } public static void SetNotMovingTimer(EnemyRigidbody rb, float value) { Type type = ((object)rb).GetType(); FieldInfo field = type.GetField("notMovingTimer", BindingFlags.Instance | BindingFlags.NonPublic); if (field != null) { field.SetValue(rb, value); } else { Debug.LogError((object)"NotMovingTimer field not found!"); } } } public class NetworkPrefabUtil { public static void RegisterNetworkPrefabs(AssetBundle bundle, ManualLogSource logger) { AssetBundle bundle2 = bundle; if ((Object)(object)bundle2 == (Object)null) { return; } List<GameObject> list = (from name in bundle2.GetAllAssetNames() where name.Contains("/prefabs/") && name.EndsWith(".prefab") select bundle2.LoadAsset<GameObject>(name)).ToList(); foreach (GameObject item in list) { NetworkPrefabs.RegisterNetworkPrefab(item); } if (list.Count > 0) { logger.LogInfo((object)$"Successfully registered {list.Count} network prefabs through REPOLib"); } } } } namespace PaintedUtils { [BepInPlugin("PaintedThornStudios.PaintedUtils", "PaintedUtils", "1.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class PaintedUtils : BaseUnityPlugin { private static readonly string BundleName = GetModName(); private AssetBundle? _assetBundle; private bool _hasFixedAudioMixerGroups = false; internal static PaintedUtils Instance { get; private set; } = null; internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private static string GetModName() { object obj = typeof(PaintedUtils).GetCustomAttributes(typeof(BepInPlugin), inherit: false)[0]; BepInPlugin val = (BepInPlugin)((obj is BepInPlugin) ? obj : null); return ((val != null) ? val.Name : null) ?? "PaintedUtils"; } private void LoadAssetBundle() { if (!((Object)(object)_assetBundle != (Object)null)) { string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); string text = Path.Combine(directoryName, BundleName + ".bundle"); _assetBundle = AssetBundle.LoadFromFile(text); if ((Object)(object)_assetBundle == (Object)null) { Logger.LogError((object)("Failed to load bundle from " + text)); } } } private void FixAllPrefabAudioMixerGroups() { if ((Object)(object)_assetBundle == (Object)null) { return; } List<GameObject> list = (from name in _assetBundle.GetAllAssetNames() where name.EndsWith(".prefab") select _assetBundle.LoadAsset<GameObject>(name)).ToList(); foreach (GameObject item in list) { Utilities.FixAudioMixerGroups(item); } } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Patch(); LoadAssetBundle(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); Logger.LogInfo((object)"White Roses have been painted Red! @CarsonJF"); } 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() { if (!_hasFixedAudioMixerGroups) { FixAllPrefabAudioMixerGroups(); _hasFixedAudioMixerGroups = true; } } } public class ColorChanger : MonoBehaviour { [Serializable] public class ColorPreset { public string presetName; public Color color = Color.white; public float emissionIntensity = 0f; public bool affectChildren = true; } [SerializeField] private List<ColorPreset> colorPresets = new List<ColorPreset>(); [SerializeField] private string currentPresetName; [SerializeField] private bool applyOnAwake = false; private Dictionary<string, ColorPreset> presetLookup = new Dictionary<string, ColorPreset>(); private List<Renderer> affectedRenderers = new List<Renderer>(); private List<Material> originalMaterials = new List<Material>(); public List<ColorPreset> ColorPresets => colorPresets; public string CurrentPresetName => currentPresetName; private void Awake() { presetLookup.Clear(); foreach (ColorPreset colorPreset in colorPresets) { if (!string.IsNullOrEmpty(colorPreset.presetName) && !presetLookup.ContainsKey(colorPreset.presetName)) { presetLookup.Add(colorPreset.presetName, colorPreset); } } CacheRenderers(); if (applyOnAwake && !string.IsNullOrEmpty(currentPresetName)) { ApplyColorPreset(currentPresetName); } } private void CacheRenderers() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown affectedRenderers.Clear(); originalMaterials.Clear(); Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren<Renderer>(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { affectedRenderers.Add(val); Material[] materials = val.materials; Material[] array2 = materials; foreach (Material val2 in array2) { originalMaterials.Add(new Material(val2)); } } } public void ApplyColorPreset(string presetName) { //IL_00bd: 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_0116: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrEmpty(presetName) || !presetLookup.ContainsKey(presetName)) { Debug.LogWarning((object)("Color preset '" + presetName + "' not found on " + ((Object)((Component)this).gameObject).name)); return; } currentPresetName = presetName; ColorPreset colorPreset = presetLookup[presetName]; int num = 0; foreach (Renderer affectedRenderer in affectedRenderers) { if (!colorPreset.affectChildren && (Object)(object)((Component)affectedRenderer).transform != (Object)(object)((Component)this).transform) { num++; continue; } Material[] materials = affectedRenderer.materials; for (int i = 0; i < materials.Length; i++) { materials[i].color = colorPreset.color; if (materials[i].HasProperty("_EmissionColor") && colorPreset.emissionIntensity > 0f) { materials[i].EnableKeyword("_EMISSION"); materials[i].SetColor("_EmissionColor", colorPreset.color * colorPreset.emissionIntensity); } else if (materials[i].HasProperty("_EmissionColor")) { materials[i].DisableKeyword("_EMISSION"); } } affectedRenderer.materials = materials; num++; } Debug.Log((object)("Applied color preset '" + presetName + "' to " + ((Object)((Component)this).gameObject).name)); } public void ResetToOriginalMaterials() { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown int num = 0; int num2 = 0; foreach (Renderer affectedRenderer in affectedRenderers) { Material[] materials = affectedRenderer.materials; for (int i = 0; i < materials.Length; i++) { if (num2 < originalMaterials.Count) { materials[i] = new Material(originalMaterials[num2]); num2++; } } affectedRenderer.materials = materials; num++; } Debug.Log((object)("Reset materials on " + ((Object)((Component)this).gameObject).name + " to original state")); } public void AddColorPreset(string name, Color color, float emissionIntensity = 0f, bool affectChildren = true) { //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) string name2 = name; if (string.IsNullOrEmpty(name2)) { Debug.LogError((object)"Cannot add color preset: name is empty"); return; } colorPresets.RemoveAll((ColorPreset p) => p.presetName == name2); ColorPreset colorPreset = new ColorPreset { presetName = name2, color = color, emissionIntensity = emissionIntensity, affectChildren = affectChildren }; colorPresets.Add(colorPreset); if (presetLookup.ContainsKey(name2)) { presetLookup[name2] = colorPreset; } else { presetLookup.Add(name2, colorPreset); } Debug.Log((object)("Added color preset '" + name2 + "' to " + ((Object)((Component)this).gameObject).name)); } public static void ColorObject(GameObject targetObject, Color color, float emissionIntensity = 0f) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) Renderer[] componentsInChildren = targetObject.GetComponentsInChildren<Renderer>(true); Renderer[] array = componentsInChildren; foreach (Renderer val in array) { Material[] materials = val.materials; for (int j = 0; j < materials.Length; j++) { materials[j].color = color; if (materials[j].HasProperty("_EmissionColor") && emissionIntensity > 0f) { materials[j].EnableKeyword("_EMISSION"); materials[j].SetColor("_EmissionColor", color * emissionIntensity); } else if (materials[j].HasProperty("_EmissionColor")) { materials[j].DisableKeyword("_EMISSION"); } } val.materials = materials; } Debug.Log((object)("Applied color to " + ((Object)targetObject).name)); } public static ColorChanger SetupOnObject(GameObject targetObject) { //IL_004e: 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_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0093: 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_00d0: 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) ColorChanger colorChanger = targetObject.GetComponent<ColorChanger>(); if ((Object)(object)colorChanger == (Object)null) { colorChanger = targetObject.AddComponent<ColorChanger>(); Debug.Log((object)("Added ColorChanger component to " + ((Object)targetObject).name)); } if (colorChanger.colorPresets.Count == 0) { colorChanger.AddColorPreset("Default", Color.white); colorChanger.AddColorPreset("Red", Color.red, 1.5f); colorChanger.AddColorPreset("Green", Color.green, 1.5f); colorChanger.AddColorPreset("Blue", Color.blue, 1.5f); colorChanger.AddColorPreset("Yellow", Color.yellow, 1.5f); colorChanger.AddColorPreset("Purple", new Color(0.5f, 0f, 0.5f), 1.5f); colorChanger.AddColorPreset("Glowing", Color.white, 2f); } return colorChanger; } } public class DebugLogger : MonoBehaviour { public void PrintToLog(string message) { Debug.Log((object)("[" + ((Object)((Component)this).gameObject).name + "] " + message)); } } [CreateAssetMenu(menuName = "PaintedUtils/Drop Table")] public class DropTable : ScriptableObject { public List<ItemDropper.ItemDrop> drops = new List<ItemDropper.ItemDrop>(); public List<DropTable> nestedTables; [Range(0f, 100f)] public int nestedTableChance = 50; } public class SickEffect : PaintedPostProcessingEffect { private float rotationSpeed = 0.5f; private float rotationAmount = 2f; private float currentRotation = 0f; private bool rotatingRight = true; private float originalCameraNoise; private float originalCameraShake; public SickEffect(float duration = 10f, float intensity = 1f) { base.duration = duration; base.intensity = intensity; isActive = false; } public override void ApplyEffect(PlayerAvatar player) { if (player.isLocal) { isActive = true; Debug.Log((object)("Applying Sick Effect to " + ((Object)player).name)); originalCameraNoise = GameplayManager.instance.cameraNoise; originalCameraShake = GameplayManager.instance.cameraShake; GameplayManager.instance.OverrideCameraNoise(0.5f * intensity, duration); GameplayManager.instance.OverrideCameraShake(0.3f * intensity, duration); if ((Object)(object)PostProcessing.Instance != (Object)null) { ((ParameterOverride<float>)(object)PostProcessing.Instance.colorGrading.tint).value = 20f * intensity; ((ParameterOverride)PostProcessing.Instance.colorGrading.tint).overrideState = true; ((ParameterOverride<float>)(object)PostProcessing.Instance.chromaticAberration.intensity).value = 0.5f * intensity; ((ParameterOverride)PostProcessing.Instance.chromaticAberration.intensity).overrideState = true; } } } public override void RemoveEffect(PlayerAvatar player) { //IL_00b5: Unknown result type (might be due to invalid IL or missing references) if (player.isLocal) { isActive = false; GameplayManager.instance.OverrideCameraNoise(originalCameraNoise, 0.5f); GameplayManager.instance.OverrideCameraShake(originalCameraShake, 0.5f); if ((Object)(object)PostProcessing.Instance != (Object)null) { ((ParameterOverride)PostProcessing.Instance.colorGrading.tint).overrideState = false; ((ParameterOverride)PostProcessing.Instance.chromaticAberration.intensity).overrideState = false; } if ((Object)(object)GameDirector.instance != (Object)null && (Object)(object)GameDirector.instance.MainCamera != (Object)null) { ((Component)GameDirector.instance.MainCamera).transform.localRotation = Quaternion.identity; } } } public override void UpdateEffect(PlayerAvatar player) { //IL_00ed: Unknown result type (might be due to invalid IL or missing references) if (!isActive || !player.isLocal || !((Object)(object)GameDirector.instance != (Object)null) || !((Object)(object)GameDirector.instance.MainCamera != (Object)null)) { return; } if (rotatingRight) { currentRotation += rotationSpeed * Time.deltaTime; if (currentRotation >= rotationAmount) { rotatingRight = false; } } else { currentRotation -= rotationSpeed * Time.deltaTime; if (currentRotation <= 0f - rotationAmount) { rotatingRight = true; } } ((Component)GameDirector.instance.MainCamera).transform.localRotation = Quaternion.Euler(0f, 0f, currentRotation * intensity); } } public abstract class BaseEnemyConfig { public ConfigEntry<float> Health { get; protected set; } public ConfigEntry<float> SpeedMultiplier { get; protected set; } public ConfigEntry<int> PlayerDamage { get; protected set; } public ConfigEntry<float> PlayerDamageCooldown { get; protected set; } public ConfigEntry<float> PlayerTumbleForce { get; protected set; } public ConfigEntry<float> PhysHitForce { get; protected set; } public ConfigEntry<float> PhysHitTorque { get; protected set; } public ConfigEntry<bool> PhysDestroy { get; protected set; } protected abstract void InitializeConfig(ConfigFile config); } public class EnemyConfigController : MonoBehaviour { protected ItemDropper itemDropper; protected EnemyHealth enemyHealth; protected NavMeshAgent navMeshAgent; protected List<HurtCollider> hurtColliders = new List<HurtCollider>(); protected EnemyRigidbody enemyRigidbody; protected BaseEnemyConfig config; protected virtual void Awake() { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown itemDropper = ((Component)this).GetComponentInChildren<ItemDropper>(true); enemyHealth = ((Component)this).GetComponentInChildren<EnemyHealth>(true); enemyRigidbody = ((Component)this).GetComponentInChildren<EnemyRigidbody>(true); navMeshAgent = ((Component)this).GetComponentInChildren<NavMeshAgent>(true); hurtColliders.AddRange(((Component)this).GetComponentsInChildren<HurtCollider>(true)); ValidateComponents(); if ((Object)(object)enemyHealth != (Object)null) { enemyHealth.onDeath.AddListener(new UnityAction(HandleDeath)); } ApplyConfigurations(); } protected virtual void ValidateComponents() { if ((Object)(object)itemDropper == (Object)null) { Debug.LogError((object)("ItemDropper component not found on " + ((Object)((Component)this).gameObject).name + " or its children!")); } else if ((Object)(object)enemyHealth == (Object)null) { Debug.LogError((object)("EnemyHealth component not found on " + ((Object)((Component)this).gameObject).name + " or its children!")); } else if (hurtColliders.Count == 0) { Debug.LogError((object)("No HurtCollider components found on " + ((Object)((Component)this).gameObject).name + " or its children!")); } else if ((Object)(object)enemyRigidbody == (Object)null) { Debug.LogError((object)("EnemyRigidbody component not found on " + ((Object)((Component)this).gameObject).name + " or its children!")); } } protected virtual void OnDestroy() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown if ((Object)(object)enemyHealth != (Object)null) { enemyHealth.onDeath.RemoveListener(new UnityAction(HandleDeath)); } } protected virtual void HandleDeath() { } protected virtual void ApplyConfigurations() { if (config == null) { return; } foreach (HurtCollider hurtCollider in hurtColliders) { hurtCollider.playerDamage = config.PlayerDamage.Value; hurtCollider.playerDamageCooldown = config.PlayerDamageCooldown.Value; hurtCollider.playerTumbleForce = config.PlayerTumbleForce.Value; hurtCollider.physHitForce = config.PhysHitForce.Value; hurtCollider.physHitTorque = config.PhysHitTorque.Value; hurtCollider.physDestroy = config.PhysDestroy.Value; } enemyHealth.health = (int)config.Health.Value; enemyRigidbody.positionSpeedIdle *= config.SpeedMultiplier.Value; enemyRigidbody.positionSpeedChase *= config.SpeedMultiplier.Value; navMeshAgent.speed *= config.SpeedMultiplier.Value; } public virtual void RefreshConfigurations() { ApplyConfigurations(); } } public class EyeStateManager : MonoBehaviour { public class EyeStateData { public float Timer; public bool IsSpeaking; public bool IsInitialized; public Color EyeColor; public Color PupilColor; public float LightIntensity; public bool EyeColorRGB = false; public bool PupilColorRGB = false; public float RGBCycleSpeed = 0.5f; public float PupilSize = 3f; private float eyeHue = 0f; private float pupilHue = 0f; public void UpdateRGBColors() { //IL_003c: 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_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) if (EyeColorRGB) { eyeHue = (eyeHue + Time.deltaTime * RGBCycleSpeed) % 1f; EyeColor = Color.HSVToRGB(eyeHue, 1f, 1f); } if (PupilColorRGB) { pupilHue = (pupilHue + Time.deltaTime * RGBCycleSpeed) % 1f; PupilColor = Color.HSVToRGB(pupilHue, 1f, 1f); } } } [CompilerGenerated] private sealed class <InitializeSpeakingState>d__10 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string playerName; public EyeStateManager <>4__this; private EyeStateData <data>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <InitializeSpeakingState>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <data>5__1 = null; <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(0.5f); <>1__state = 1; return true; case 1: <>1__state = -1; if (<>4__this.activeStates.TryGetValue(playerName, out <data>5__1)) { <data>5__1.IsInitialized = true; } 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(); } } private static EyeStateManager? instance; private Dictionary<string, EyeStateData> activeStates = new Dictionary<string, EyeStateData>(); public static EyeStateManager Instance { get { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown if ((Object)(object)instance == (Object)null) { GameObject val = new GameObject("EyeStateManager"); instance = val.AddComponent<EyeStateManager>(); Object.DontDestroyOnLoad((Object)(object)val); } return instance; } } private void Update() { foreach (KeyValuePair<string, EyeStateData> item in activeStates.ToList()) { string key = item.Key; EyeStateData value = item.Value; if (value.Timer > 0f) { value.Timer -= Time.deltaTime; if (value.Timer <= 0f) { ResetEyes(key); activeStates.Remove(key); continue; } } if (value.IsInitialized && (value.EyeColorRGB || value.PupilColorRGB)) { value.UpdateRGBColors(); ApplyEyeState(key, value); } } } public void SetEyeState(string playerName, Color eyeColor, Color pupilColor, float lightIntensity, float duration = 0f, bool eyeColorRGB = false, bool pupilColorRGB = false, float pupilSize = 3f) { //IL_001d: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) EyeStateData eyeStateData = new EyeStateData { Timer = duration, IsSpeaking = true, IsInitialized = false, EyeColor = eyeColor, PupilColor = pupilColor, LightIntensity = lightIntensity, EyeColorRGB = eyeColorRGB, PupilColorRGB = pupilColorRGB, PupilSize = pupilSize }; activeStates[playerName] = eyeStateData; ApplyEyeState(playerName, eyeStateData); ((MonoBehaviour)this).StartCoroutine(InitializeSpeakingState(playerName)); } public void ClearEyeState(string playerName) { if (activeStates.TryGetValue(playerName, out EyeStateData _)) { ResetEyes(playerName); activeStates.Remove(playerName); } } private void ApplyEyeState(string playerName, EyeStateData data) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_0040: 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_0051: Unknown result type (might be due to invalid IL or missing references) PlayerAvatar val = SemiFunc.PlayerGetFromName(playerName); if (!((Object)(object)val?.playerHealth == (Object)null)) { val.playerHealth.overrideEyeMaterialColor = data.EyeColor; val.playerHealth.overridePupilMaterialColor = data.PupilColor; val.playerHealth.overrideEyeLightColor = data.EyeColor; val.playerHealth.overrideEyeLightIntensity = data.LightIntensity; val.playerHealth.EyeMaterialOverride((EyeOverrideState)100, 0.25f, 40); PlayerAvatar playerAvatar = ChatManager.instance.playerAvatar; if (playerAvatar != null) { playerAvatar.OverridePupilSize(data.PupilSize, 4, 15f, 0.3f, 15f, 0.3f, 0.1f); } } } private void ResetEyes(string playerName) { PlayerAvatar val = SemiFunc.PlayerGetFromName(playerName); if (!((Object)(object)val?.playerHealth == (Object)null)) { val.playerHealth.EyeMaterialOverride((EyeOverrideState)0, 0.25f, 0); } } [IteratorStateMachine(typeof(<InitializeSpeakingState>d__10))] private IEnumerator InitializeSpeakingState(string playerName) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <InitializeSpeakingState>d__10(0) { <>4__this = this, playerName = playerName }; } public EyeStateData? GetActiveStateFor(string playerName) { if (activeStates.TryGetValue(playerName, out EyeStateData value)) { return value; } return null; } } [HarmonyPatch(typeof(PlayerHealth), "Update")] public class ForceCustomEyeStatePatch { private static void Prefix(PlayerHealth __instance) { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: 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_0090: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null || (Object)(object)__instance.photonView == (Object)null || !__instance.photonView.IsMine) { return; } string text = __instance.playerAvatar?.playerName; if (string.IsNullOrEmpty(text)) { return; } try { EyeStateManager.EyeStateData activeStateFor = EyeStateManager.Instance.GetActiveStateFor(text); if (activeStateFor != null) { __instance.overrideEyeMaterialColor = activeStateFor.EyeColor; __instance.overridePupilMaterialColor = activeStateFor.PupilColor; __instance.overrideEyeLightColor = activeStateFor.EyeColor; __instance.overrideEyeLightIntensity = activeStateFor.LightIntensity; if (__instance.overrideEyePriority < 50) { __instance.EyeMaterialOverride((EyeOverrideState)100, 0.25f, 50); } PlayerAvatar playerAvatar = __instance.playerAvatar; if (playerAvatar != null) { playerAvatar.OverridePupilSize(activeStateFor.PupilSize, 4, 1f, 1f, 15f, 0.3f, 0.1f); } } } catch (Exception arg) { Debug.LogError((object)$"[EyeStateManager] Failed to apply eye state for {text}: {arg}"); } } } public class ItemDropper : MonoBehaviour { public enum PrefabType { NetworkPrefab, Valuable, Item } public enum DropChanceType { Weight, Percentage } [Serializable] public class ItemDrop { public GameObject itemPrefab; public int minQuantity = 1; public int maxQuantity = 1; public DropChanceType dropChanceType = DropChanceType.Weight; [Tooltip("Used when Drop Chance Type is set to Weight")] public int weight = 100; [Range(0f, 100f)] [Tooltip("Percentage chance this item will drop. Used when Drop Chance Type is set to Percentage")] public float chance = 100f; public bool guaranteed = false; public PrefabType prefabType; public Rarity rarity; } [SerializeField] private DropTable dropTable; [SerializeField] private Transform dropTarget; [SerializeField] private float dropSpreadRadius = 0.5f; [SerializeField] private bool applyForce = true; [SerializeField] private float forceStrength = 3f; [SerializeField] private int minItemTypes = 1; [SerializeField] private int maxItemTypes = 3; public DropTable DropTable => dropTable; public float DropSpreadRadius => dropSpreadRadius; public float ForceStrength => forceStrength; public void InitializeDropTable(string dropTableResourcePath) { if ((Object)(object)dropTable == (Object)null) { dropTable = Resources.Load<DropTable>(dropTableResourcePath); if (!((Object)(object)dropTable != (Object)null)) { } } } public void InitializeDropTableFromName() { if ((Object)(object)dropTable != (Object)null) { return; } string text = ((Object)((Component)this).gameObject).name; string[] array = new string[3] { "Controller", "Prefab", "(Clone)" }; string[] array2 = array; foreach (string text2 in array2) { if (text.EndsWith(text2)) { text = text.Substring(0, text.Length - text2.Length).Trim(); } } string[] array3 = new string[3] { "DropTables/" + text + "DropTable", "DropTables/" + text, "DropTables/DefaultDropTable" }; string[] array4 = array3; foreach (string dropTableResourcePath in array4) { InitializeDropTable(dropTableResourcePath); if ((Object)(object)dropTable != (Object)null) { return; } } Debug.LogWarning((object)("Could not auto-load drop table for " + ((Object)((Component)this).gameObject).name + ". Tried paths: " + string.Join(", ", array3))); } public static ItemDropper SetupDropperOnObject(GameObject targetObject, string dropTablePath, float spreadRadius = 0.5f, float force = 3f) { ItemDropper itemDropper = targetObject.GetComponent<ItemDropper>(); if ((Object)(object)itemDropper == (Object)null) { itemDropper = targetObject.AddComponent<ItemDropper>(); } itemDropper.InitializeDropTable(dropTablePath); if ((Object)(object)itemDropper.DropTable != (Object)null) { typeof(ItemDropper).GetField("dropSpreadRadius", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(itemDropper, spreadRadius); typeof(ItemDropper).GetField("forceStrength", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(itemDropper, force); } return itemDropper; } public static void DropItemsAtPosition(DropTable dropTable, Vector3 position, float dropRadius = 0.5f, float force = 3f) { //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: 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_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: 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_02f7: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0251: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)dropTable == (Object)null) { Debug.LogWarning((object)"Cannot drop items: No drop table provided to static method"); dropTable = Resources.Load<DropTable>("DropTables/DefaultDropTable"); if ((Object)(object)dropTable == (Object)null) { Debug.LogError((object)"Failed to load fallback drop table. No items will be dropped."); return; } } foreach (ItemDrop drop in dropTable.drops) { bool flag = false; if (drop.guaranteed) { flag = true; } else if (drop.dropChanceType == DropChanceType.Percentage) { flag = Random.Range(0f, 100f) < drop.chance; } if (flag) { int num = Random.Range(drop.minQuantity, drop.maxQuantity + 1); for (int i = 0; i < num; i++) { Vector3 position2 = position + Random.insideUnitSphere * dropRadius; SpawnPrefabStatic(drop, position2, force); } } } List<ItemDrop> list = dropTable.drops.FindAll((ItemDrop d) => !d.guaranteed && d.dropChanceType == DropChanceType.Weight && d.weight > 0); if (list.Count > 0) { int num2 = Mathf.Clamp(Random.Range(1, 4), 1, list.Count); for (int j = 0; j < num2; j++) { if (list.Count == 0) { break; } int num3 = 0; foreach (ItemDrop item in list) { num3 += item.weight; } int num4 = Random.Range(0, num3); int num5 = 0; int index = 0; for (int k = 0; k < list.Count; k++) { num5 += list[k].weight; if (num4 < num5) { index = k; break; } } ItemDrop itemDrop = list[index]; list.RemoveAt(index); int num6 = Random.Range(itemDrop.minQuantity, itemDrop.maxQuantity + 1); for (int l = 0; l < num6; l++) { Vector3 position3 = position + Random.insideUnitSphere * dropRadius; SpawnPrefabStatic(itemDrop, position3, force); } } } if (dropTable.nestedTables != null && dropTable.nestedTables.Count > 0 && Random.Range(0, 100) < dropTable.nestedTableChance) { int index2 = Random.Range(0, dropTable.nestedTables.Count); DropTable dropTable2 = dropTable.nestedTables[index2]; if ((Object)(object)dropTable2 != (Object)null) { DropItemsAtPosition(dropTable2, position, dropRadius, force); } } } public static void DropItemsAtPosition(string dropTableResourcePath, Vector3 position, float dropRadius = 0.5f, float force = 3f) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) DropTable dropTable = Resources.Load<DropTable>(dropTableResourcePath); DropItemsAtPosition(dropTable, position, dropRadius, force); } public static void DropItemsForGameObject(GameObject sourceObject, string dropTableResourcePath = null) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0099: 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) if ((Object)(object)sourceObject == (Object)null) { Debug.LogError((object)"Cannot drop items: Source GameObject is null"); return; } ItemDropper component = sourceObject.GetComponent<ItemDropper>(); if ((Object)(object)component != (Object)null && (Object)(object)component.DropTable != (Object)null) { DropItemsAtPosition(component.DropTable, sourceObject.transform.position, component.DropSpreadRadius, component.ForceStrength); } else if (!string.IsNullOrEmpty(dropTableResourcePath)) { DropItemsAtPosition(dropTableResourcePath, sourceObject.transform.position); } else { DropItemsAtPosition((DropTable)null, sourceObject.transform.position, 0.5f, 3f); } } private static void SpawnPrefabStatic(ItemDrop drop, Vector3 position, float forceStrength) { //IL_0042: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) if (!SemiFunc.IsMasterClientOrSingleplayer()) { return; } GameObject val = null; switch (drop.prefabType) { case PrefabType.NetworkPrefab: val = NetworkPrefabs.SpawnNetworkPrefab(((Object)drop.itemPrefab).name, position, Quaternion.identity, (byte)0, (object[])null); break; case PrefabType.Valuable: val = Valuables.SpawnValuable(Valuables.GetValuableByName(((Object)drop.itemPrefab).name), position, Quaternion.identity); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not spawn Valuable: " + ((Object)drop.itemPrefab).name)); } break; case PrefabType.Item: { string text = ((Object)drop.itemPrefab).name; if (!text.StartsWith("Item ")) { text = "Item " + text; } val = NetworkPrefabs.SpawnNetworkPrefab(text, position, Quaternion.identity, (byte)0, (object[])null); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not spawn Item: " + text)); } break; } } if ((Object)(object)val != (Object)null && forceStrength > 0f) { Rigidbody component = val.GetComponent<Rigidbody>(); if ((Object)(object)component != (Object)null) { component.AddForce(Random.onUnitSphere * forceStrength, (ForceMode)1); } } if ((Object)(object)drop.rarity != (Object)null && (Object)(object)val != (Object)null) { RarityEffectHandle effectHandle = RarityEffectManager.TryPlayEffects(drop.rarity, position, val.transform); RarityEffectTracker rarityEffectTracker = val.AddComponent<RarityEffectTracker>(); rarityEffectTracker.effectHandle = effectHandle; } } public void DropItems() { //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: 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_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)this.dropTable == (Object)null) { InitializeDropTableFromName(); if ((Object)(object)this.dropTable == (Object)null) { Debug.LogWarning((object)("No drop table found for " + ((Object)((Component)this).gameObject).name)); return; } } foreach (ItemDrop drop in this.dropTable.drops) { bool flag = false; if (drop.guaranteed) { flag = true; } else if (drop.dropChanceType == DropChanceType.Percentage) { flag = Random.Range(0f, 100f) < drop.chance; } if (flag) { int num = Random.Range(drop.minQuantity, drop.maxQuantity + 1); for (int i = 0; i < num; i++) { Vector3 spreadPosition = GetSpreadPosition(((Component)this).transform.position); SpawnPrefab(drop, spreadPosition); } } } List<ItemDrop> list = this.dropTable.drops.FindAll((ItemDrop d) => !d.guaranteed && d.dropChanceType == DropChanceType.Weight && d.weight > 0); if (list.Count > 0) { int num2 = Mathf.Clamp(Random.Range(minItemTypes, maxItemTypes + 1), 1, list.Count); for (int j = 0; j < num2; j++) { if (list.Count == 0) { break; } int index = PickWeightedIndex(list); ItemDrop itemDrop = list[index]; list.RemoveAt(index); int num3 = Random.Range(itemDrop.minQuantity, itemDrop.maxQuantity + 1); for (int k = 0; k < num3; k++) { Vector3 spreadPosition2 = GetSpreadPosition(((Component)this).transform.position); SpawnPrefab(itemDrop, spreadPosition2); } } } if (this.dropTable.nestedTables != null && this.dropTable.nestedTables.Count > 0 && Random.Range(0, 100) < this.dropTable.nestedTableChance) { int index2 = Random.Range(0, this.dropTable.nestedTables.Count); DropTable dropTable = this.dropTable.nestedTables[index2]; if ((Object)(object)dropTable != (Object)null) { DropTable dropTable2 = this.dropTable; this.dropTable = dropTable; DropItems(); this.dropTable = dropTable2; } } } private Vector3 GetSpreadPosition(Vector3 center) { //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_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_0017: 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) return center + Random.insideUnitSphere * dropSpreadRadius; } private void SpawnPrefab(ItemDrop drop, Vector3 position) { //IL_0042: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0066: 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_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) if (!SemiFunc.IsMasterClientOrSingleplayer()) { return; } GameObject val = null; switch (drop.prefabType) { case PrefabType.NetworkPrefab: val = NetworkPrefabs.SpawnNetworkPrefab(((Object)drop.itemPrefab).name, position, Quaternion.identity, (byte)0, (object[])null); break; case PrefabType.Valuable: val = Valuables.SpawnValuable(Valuables.GetValuableByName(((Object)drop.itemPrefab).name), position, Quaternion.identity); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not spawn Valuable: " + ((Object)drop.itemPrefab).name)); } break; case PrefabType.Item: { string text = ((Object)drop.itemPrefab).name; if (!text.StartsWith("Item ")) { text = "Item " + text; } val = NetworkPrefabs.SpawnNetworkPrefab(text, position, Quaternion.identity, (byte)0, (object[])null); if ((Object)(object)val == (Object)null) { Debug.LogWarning((object)("Could not spawn Item: " + text)); } break; } } if ((Object)(object)val != (Object)null && applyForce) { Rigidbody component = val.GetComponent<Rigidbody>(); if ((Object)(object)component != (Object)null) { component.AddForce(Random.onUnitSphere * forceStrength, (ForceMode)1); } } if ((Object)(object)drop.rarity != (Object)null && (Object)(object)val != (Object)null) { RarityEffectHandle effectHandle = RarityEffectManager.TryPlayEffects(drop.rarity, position, val.transform); RarityEffectTracker rarityEffectTracker = val.AddComponent<RarityEffectTracker>(); rarityEffectTracker.effectHandle = effectHandle; } } private int PickWeightedIndex(List<ItemDrop> drops) { int num = 0; foreach (ItemDrop drop in drops) { num += drop.weight; } int num2 = Random.Range(0, num); int num3 = 0; for (int i = 0; i < drops.Count; i++) { num3 += drops[i].weight; if (num2 < num3) { return i; } } return 0; } } public interface IPhysGrabber { IItemAttributes currentlyLookingAtItemAttributes { get; } } public interface IItemAttributes { GameObject gameObject { get; } string GetDisplayName(); } public static class GameInterfaces { public static IPhysGrabber PhysGrabber { get; set; } public static void UIItemInfoText(IItemAttributes itemAttributes, string promptText) { } } [RequireComponent(typeof(Collider))] public class ItemLibrary : MonoBehaviour, IItemAttributes { [Header("Prompt Settings")] public bool enablePrompt = true; [Tooltip("Displayed when the player looks at the item.")] public string promptText = "Press E to Interact"; [Tooltip("Display name for the item")] public string displayName; [Header("Battery Settings")] public bool useBattery = false; public ItemBattery battery; [Header("Interaction Settings")] public bool allowInteraction = true; public KeyCode interactionKey = (KeyCode)101; [Header("Unity Events")] public UnityEvent onInteract; public UnityEvent onLookAt; public UnityEvent onBatteryEmpty; private bool isLookedAt = false; public string GetDisplayName() { return (!string.IsNullOrEmpty(displayName)) ? displayName : ((Object)((Component)this).gameObject).name; } private void Start() { if (useBattery && (Object)(object)battery == (Object)null) { battery = ((Component)this).GetComponent<ItemBattery>(); if (!((Object)(object)battery == (Object)null)) { } } } private void Update() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) HandleLookAt(); if (isLookedAt && allowInteraction && Input.GetKeyDown(interactionKey)) { TryUse(); } if (useBattery && (Object)(object)battery != (Object)null && battery.batteryLife <= 0f) { onBatteryEmpty.Invoke(); } } private void HandleLookAt() { if (!enablePrompt || GameInterfaces.PhysGrabber == null) { return; } if (GameInterfaces.PhysGrabber.currentlyLookingAtItemAttributes != null && (Object)(object)GameInterfaces.PhysGrabber.currentlyLookingAtItemAttributes.gameObject == (Object)(object)((Component)this).gameObject) { if (!isLookedAt) { isLookedAt = true; onLookAt.Invoke(); } GameInterfaces.UIItemInfoText(this, promptText); } else { isLookedAt = false; } } private void TryUse() { if (allowInteraction && (!useBattery || !((Object)(object)battery != (Object)null) || !(battery.batteryLife <= 0f))) { onInteract.Invoke(); } } GameObject IItemAttributes.get_gameObject() { return ((Component)this).gameObject; } } public class ItemBattery : MonoBehaviour { [Header("Battery Settings")] public float batteryLife = 100f; public float maxBatteryLife = 100f; public float drainRate = 1f; public bool isDraining = false; [Header("Events")] public UnityEvent onBatteryEmpty; public UnityEvent onBatteryDrained; public UnityEvent onBatteryRecharged; private bool wasEmpty = false; private void Update() { if (isDraining) { DrainBattery(drainRate * Time.deltaTime); } if (batteryLife <= 0f && !wasEmpty) { wasEmpty = true; UnityEvent obj = onBatteryEmpty; if (obj != null) { obj.Invoke(); } } else if (batteryLife > 0f && wasEmpty) { wasEmpty = false; } } public void DrainBattery(float amount) { if (!(batteryLife <= 0f)) { batteryLife = Mathf.Max(0f, batteryLife - amount); UnityEvent obj = onBatteryDrained; if (obj != null) { obj.Invoke(); } } } public void RechargeBattery(float amount) { batteryLife = Mathf.Min(maxBatteryLife, batteryLife + amount); UnityEvent obj = onBatteryRecharged; if (obj != null) { obj.Invoke(); } } public void SetBatteryFull() { batteryLife = maxBatteryLife; UnityEvent obj = onBatteryRecharged; if (obj != null) { obj.Invoke(); } } public float GetBatteryPercentage() { return batteryLife / maxBatteryLife; } } public class MusicalItemHandler : MonoBehaviourPunCallbacks { public enum PowerOffBehavior { None, OnDrop, OnSlamWhenNotHeld, OnSlamWhenHeld, OnSlam } public enum SkipBehavior { None, SkipWhenNotHeld, SkipWhenHeld, SkipAlways } [CompilerGenerated] private sealed class <FadeIn>d__56 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MusicalItemHandler <>4__this; private float <startVolume>5__1; private float <targetVolume>5__2; private float <elapsedTime>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <FadeIn>d__56(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <startVolume>5__1 = <>4__this.audioSource.volume; <targetVolume>5__2 = <>4__this.volume * <>4__this.musicVolumeMultiplier; <elapsedTime>5__3 = 0f; break; case 1: <>1__state = -1; break; } if (<elapsedTime>5__3 < <>4__this.fadeDuration) { <elapsedTime>5__3 += Time.deltaTime; <>4__this.audioSource.volume = Mathf.Lerp(<startVolume>5__1, <targetVolume>5__2, <elapsedTime>5__3 / <>4__this.fadeDuration); <>2__current = null; <>1__state = 1; return true; } <>4__this.audioSource.volume = <targetVolume>5__2; 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(); } } [CompilerGenerated] private sealed class <FadeOut>d__57 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MusicalItemHandler <>4__this; private float <startVolume>5__1; private float <elapsedTime>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <FadeOut>d__57(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <startVolume>5__1 = <>4__this.audioSource.volume; <elapsedTime>5__2 = 0f; break; case 1: <>1__state = -1; break; } if (<elapsedTime>5__2 < <>4__this.fadeDuration) { <elapsedTime>5__2 += Time.deltaTime; <>4__this.audioSource.volume = Mathf.Lerp(<startVolume>5__1, 0f, <elapsedTime>5__2 / <>4__this.fadeDuration); <>2__current = null; <>1__state = 1; return true; } <>4__this.audioSource.volume = 0f; <>4__this.audioSource.Stop(); 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(); } } [CompilerGenerated] private sealed class <RGBCycleLight>d__58 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MusicalItemHandler <>4__this; private float <hue>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RGBCycleLight>d__58(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0086: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <hue>5__1 = 0f; break; case 1: <>1__state = -1; break; } <hue>5__1 = (<hue>5__1 + Time.deltaTime * <>4__this.rgbCycleSpeed) % 1f; if ((Object)(object)<>4__this.speakerLight != (Object)null) { <>4__this.speakerLight.color = Color.HSVToRGB(<hue>5__1, 1f, 1f); } <>2__current = null; <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <StartFirstTrackWithDelay>d__49 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public MusicalItemHandler <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <StartFirstTrackWithDelay>d__49(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(<>4__this.initialTrackDelay); <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this.PlayTrack(<>4__this.currentTrackIndex); 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(); } } [Header("Audio")] [SerializeField] private AudioSource audioSource; [SerializeField] private TrackData? trackData; [Range(0.1f, 10f)] [Tooltip("Multiplies the base volume of the music")] public float musicVolumeMultiplier = 1f; [Tooltip("Base volume level for the music (0-1)")] [Range(0f, 1f)] [SerializeField] private float volume = 1f; [Tooltip("Duration of fade in/out effects in seconds")] [SerializeField] private float fadeDuration = 1f; public Rarity.Sound? powerOnSound; public Rarity.Sound? powerOffSound; public Rarity.Sound? skipSound; private int currentTrack = -1; private AudioSource? currentTrackSource; [Header("Effects")] public ParticleSystem? musicParticles; public ParticleSystem? impactParticles; public Light? speakerLight; public float impactParticleDuration = 2f; public float lightIntensity = 2f; [Header("Settings")] public float minMessageDelay = 8f; public float maxMessageDelay = 16f; public bool skipOnImpact = true; public bool turnOffOnHeavyImpact = true; [Tooltip("Delay in seconds before the first track starts playing after power on")] public float initialTrackDelay = 1f; private float coolDownUntilNextMessage; private float initialMessageDelay = 8f; private float musicStartDelay = 5f; public bool requireHeldForNextTrack = true; public PowerOffBehavior powerOffBehavior = PowerOffBehavior.OnSlamWhenNotHeld; public SkipBehavior skipBehavior = SkipBehavior.SkipWhenNotHeld; private PhysGrabObject? physGrabObject; private PhysGrabObjectImpactDetector? impactDetector; private bool isPlaying; private float nextMessageTime; private Coroutine fadeCoroutine; private int currentTrackIndex = 0; private Coroutine rgbCycleCoroutine; private float rgbCycleSpeed = 0.5f; private string[][] trackMessages = new string[1][] { new string[6] { "Let's get this party started!", "Time to turn up!", "Music makes the world go round!", "Feel the beat!", "Dance like nobody's watching!", "Let the music take control!" } }; public void SetTrackMessages(string[][] newMessages) { trackMessages = newMessages; } private void Start() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: 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) physGrabObject = ((Component)this).GetComponent<PhysGrabObject>(); impactDetector = ((Component)this).GetComponent<PhysGrabObjectImpactDetector>(); if ((Object)(object)impactDetector != (Object)null) { impactDetector.onImpactHeavy.AddListener(new UnityAction(OnHeavyImpact)); } if ((Object)(object)audioSource == (Object)null) { audioSource = ((Component)this).gameObject.AddComponent<AudioSource>(); } audioSource.volume = 0f; audioSource.spatialBlend = 1f; audioSource.rolloffMode = (AudioRolloffMode)2; audioSource.maxDistance = 50f; if ((Object)(object)musicParticles != (Object)null) { MainModule main = musicParticles.main; ((MainModule)(ref main)).playOnAwake = false; ((MainModule)(ref main)).loop = true; musicParticles.Stop(true, (ParticleSystemStopBehavior)0); } if ((Object)(object)impactParticles != (Object)null) { MainModule main2 = impactParticles.main; ((MainModule)(ref main2)).playOnAwake = false; impactParticles.Stop(true, (ParticleSystemStopBehavior)0); } if ((Object)(object)speakerLight != (Object)null) { ((Component)speakerLight).gameObject.SetActive(false); } isPlaying = false; } private void OnDestroy() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown if ((Object)(object)impactDetector != (Object)null) { impactDetector.onImpactHeavy.RemoveListener(new UnityAction(OnHeavyImpact)); } ClearCurrentEyeState(); } private void ClearCurrentEyeState() { string playerName = ChatManager.instance.playerAvatar.playerName; EyeStateManager.Instance.ClearEyeState(playerName); } private void Update() { if (!isPlaying || (Object)(object)trackData == (Object)null) { return; } if (Time.time >= nextMessageTime) { SendTrackMessage(); } if ((Object)(object)physGrabObject != (Object)null) { if (physGrabObject.grabbed && !isPlaying) { StartMusic(); } else if (physGrabObject.grabbed && isPlaying && Time.time >= nextMessageTime) { SendTrackMessage(); } } if (isPlaying && (Object)(object)speakerLight != (Object)null && ((Component)speakerLight).gameObject.activeSelf) { TrackMessageData trackMessageData = trackData.GetTrackData(currentTrack); if (trackMessageData != null) { speakerLight.intensity = Mathf.Lerp(speakerLight.intensity, trackMessageData.lightIntensity, Time.deltaTime * 5f); } } if (powerOffBehavior == PowerOffBehavior.OnDrop && (Object)(object)physGrabObject != (Object)null && !physGrabObject.grabbed && isPlaying) { StopMusic(); } } private void SendTrackMessage() { //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: 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_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_01f6: Unknown result type (might be due to invalid IL or missing references) //IL_032d: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)trackData == (Object)null || (Object)(object)ChatManager.instance == (Object)null || ChatManager.instance.StateIsPossessed() || (Object)(object)physGrabObject == (Object)null || !physGrabObject.heldByLocalPlayer || (Object)(object)physGrabObject == (Object)null || !physGrabObject.grabbed) { return; } TrackMessageData trackMessageData = trackData.GetTrackData(currentTrack); if (trackMessageData == null) { return; } string randomMessage = trackData.GetRandomMessage(currentTrack); if (string.IsNullOrEmpty(randomMessage)) { return; } float messageDuration = trackData.GetMessageDuration(currentTrack, randomMessage); Color val = default(Color); ((Color)(ref val))..ctor(trackMessageData.eyeColor.r, trackMessageData.eyeColor.g, trackMessageData.eyeColor.b, 1f); Color val2 = default(Color); ((Color)(ref val2))..ctor(trackMessageData.pupilColor.r, trackMessageData.pupilColor.g, trackMessageData.pupilColor.b, 1f); val.a = 1f; val2.a = 1f; string playerName = ChatManager.instance.playerAvatar.playerName; EyeStateManager.Instance.SetEyeState(playerName, val, val2, trackMessageData.lightIntensity, messageDuration + 1f, eyeColorRGB: false, pupilColorRGB: false, trackMessageData.pupilSize); if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("SyncSpeakerEyeEffect", (RpcTarget)1, new object[6] { playerName, new float[4] { val.r, val.g, val.b, val.a }, new float[4] { val2.r, val2.g, val2.b, val2.a }, trackMessageData.lightIntensity, trackMessageData.pupilSize, messageDuration + 1f }); } string newValue = "friend"; if (SemiFunc.IsMultiplayer()) { List<PlayerAvatar> list = SemiFunc.PlayerGetAllPlayerAvatarWithinRange(10f, ((Component)this).transform.position, false, default(LayerMask)); PlayerAvatar val3 = null; float num = float.MaxValue; foreach (PlayerAvatar item in list) { if ((Object)(object)item != (Object)(object)PlayerAvatar.instance) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)item).transform.position); if (num2 < num) { num = num2; val3 = item; } } } if ((Object)(object)val3 != (Object)null) { newValue = val3.playerName; } } randomMessage = randomMessage.Replace("{playerName}", newValue); ChatManager.instance.PossessChatScheduleStart(10); ChatManager.instance.PossessChat((PossessChatID)1001, randomMessage, messageDuration, val, 0f, false, 0, (UnityEvent)null); ChatManager.instance.PossessChatScheduleEnd(); nextMessageTime = Time.time + trackData.messageFrequency + Random.Range(0f - trackData.messageRandomness, trackData.messageRandomness); } private void OnHeavyImpact() { if (!isPlaying) { return; } bool flag = (Object)(object)physGrabObject != (Object)null && physGrabObject.grabbed; if (!SemiFunc.IsMasterClientOrSingleplayer()) { return; } switch (powerOffBehavior) { case PowerOffBehavior.OnSlam: StopMusic(); return; case PowerOffBehavior.OnSlamWhenHeld: if (flag) { StopMusic(); return; } break; case PowerOffBehavior.OnSlamWhenNotHeld: if (!flag) { StopMusic(); return; } break; } switch (skipBehavior) { case SkipBehavior.SkipAlways: NextTrack(); break; case SkipBehavior.SkipWhenHeld: if (flag) { NextTrack(); } break; case SkipBehavior.SkipWhenNotHeld: if (!flag) { NextTrack(); } break; } } private void OnMediumImpact() { if (!isPlaying) { return; } bool flag = (Object)(object)physGrabObject != (Object)null && physGrabObject.grabbed; if (!SemiFunc.IsMasterClientOrSingleplayer()) { return; } switch (skipBehavior) { case SkipBehavior.SkipAlways: NextTrack(); break; case SkipBehavior.SkipWhenHeld: if (flag) { NextTrack(); } break; case SkipBehavior.SkipWhenNotHeld: if (!flag) { NextTrack(); } break; } } private void OnLightImpact() { } private void StopImpactParticles() { if ((Object)(object)impactParticles != (Object)null) { impactParticles.Stop(); ((Component)impactParticles).gameObject.SetActive(false); } } public void StartMusic() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) if (isPlaying) { return; } if ((Object)(object)trackData == (Object)null) { Debug.LogError((object)"Cannot start music: trackData is null"); return; } isPlaying = true; if ((Object)(object)powerOnSound?.clip != (Object)null) { AudioSource.PlayClipAtPoint(powerOnSound.clip, ((Component)this).transform.position, powerOnSound.volume); if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("PlayPowerOnSoundRPC", (RpcTarget)1, Array.Empty<object>()); } } ((MonoBehaviour)this).StartCoroutine(StartFirstTrackWithDelay()); if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("StartMusicRPC", (RpcTarget)1, Array.Empty<object>()); } } [PunRPC] private void StartMusicRPC() { if (!isPlaying) { isPlaying = true; ((MonoBehaviour)this).StartCoroutine(StartFirstTrackWithDelay()); } } [IteratorStateMachine(typeof(<StartFirstTrackWithDelay>d__49))] private IEnumerator StartFirstTrackWithDelay() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <StartFirstTrackWithDelay>d__49(0) { <>4__this = this }; } public void StopMusic() { //IL_00dd: Unknown result type (might be due to invalid IL or missing references) if (!isPlaying) { return; } isPlaying = false; if (SemiFunc.IsMasterClientOrSingleplayer()) { if ((Object)(object)musicParticles != (Object)null) { musicParticles.Stop(); ((Component)musicParticles).gameObject.SetActive(false); } if ((Object)(object)impactParticles != (Object)null) { ((Component)impactParticles).gameObject.SetActive(true); impactParticles.Play(); } if (rgbCycleCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(rgbCycleCoroutine); rgbCycleCoroutine = null; } } if ((Object)(object)powerOffSound?.clip != (Object)null) { AudioSource.PlayClipAtPoint(powerOffSound.clip, ((Component)this).transform.position); } if ((Object)(object)speakerLight != (Object)null) { ((Component)speakerLight).gameObject.SetActive(false); } if (fadeCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(fadeCoroutine); } fadeCoroutine = ((MonoBehaviour)this).StartCoroutine(FadeOut()); if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("StopMusicRPC", (RpcTarget)1, Array.Empty<object>()); } } [PunRPC] private void StopMusicRPC() { if (isPlaying) { isPlaying = false; if ((Object)(object)musicParticles != (Object)null) { musicParticles.Stop(true, (ParticleSystemStopBehavior)0); ((Component)musicParticles).gameObject.SetActive(false); } if ((Object)(object)impactParticles != (Object)null) { ((Component)impactParticles).gameObject.SetActive(true); impactParticles.Play(); } if (rgbCycleCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(rgbCycleCoroutine); rgbCycleCoroutine = null; } if ((Object)(object)speakerLight != (Object)null) { ((Component)speakerLight).gameObject.SetActive(false); } if (fadeCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(fadeCoroutine); } fadeCoroutine = ((MonoBehaviour)this).StartCoroutine(FadeOut()); } } public void ToggleMusic() { if (isPlaying) { StopMusic(); } else { StartMusic(); } } public void NextTrack() { //IL_007b: Unknown result type (might be due to invalid IL or missing references) if (isPlaying && !((Object)(object)trackData == (Object)null)) { currentTrackIndex = (currentTrackIndex + 1) % trackData.tracks.Count; PlayTrack(currentTrackIndex); if ((Object)(object)skipSound?.clip != (Object)null) { AudioSource.PlayClipAtPoint(skipSound.clip, ((Component)this).transform.position); } if (SemiFunc.IsMultiplayer()) { ((MonoBehaviourPun)this).photonView.RPC("NextTrackRPC", (RpcTarget)1, new object[1] { currentTrackIndex }); } } } [PunRPC] private void NextTrackRPC(int trackIndex) { if (isPlaying && (Object)(object)trackData != (Object)null) { currentTrackIndex = trackIndex; PlayTrack(currentTrackIndex); } } private void PlayTrack(int index) { //IL_0238: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)trackData == (Object)null) { Debug.LogError((object)"PlayTrack failed: trackData is null"); return; } if (fadeCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(fadeCoroutine); } if (rgbCycleCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(rgbCycleCoroutine); } TrackMessageData trackMessageData = trackData.GetTrackData(index); if (trackMessageData == null) { Debug.LogError((object)$"PlayTrack failed: No track data found for index {index}"); return; } if (trackMessageData.sound == null) { Debug.LogError((object)$"PlayTrack failed: Track {index} has no sound data"); return; } if ((Object)(object)trackMessageData.sound.clip == (Object)null) { Debug.LogError((object)$"PlayTrack failed: Track {index} sound has no audio clip"); return; } audioSource.clip = trackMessageData.sound.clip; audioSource.loop = true; audioSource.spatialBlend = trackMessageData.sound.spatialBlend; audioSource.dopplerLevel = trackMessageData.sound.doppler; audioSource.reverbZoneMix = trackMessageData.sound.reverbMix; audioSource.Play(); fadeCoroutine = ((MonoBehaviour)this).StartCoroutine(FadeIn()); if ((Object)(object)trackMessageData.trackParticles != (Object)null) { if ((Object)(object)musicParticles != (Object)null) { musicParticles.Stop(true, (ParticleSystemStopBehavior)0); ((Component)musicParticles).gameObject.SetActive(false); } ((Component)trackMessageData.trackParticles).gameObject.SetActive(true); trackMessageData.trackParticles.Play(); } else if ((Object)(object)musicParticles != (Object)null) { ((Component)musicParticles).gameObject.SetActive(true); musicParticles.Play(); } if ((Object)(object)speakerLight != (Object)null) { ((Component)speakerLight).gameObject.SetActive(true); speakerLight.color = trackMessageData.lightColor; speakerLight.intensity = 0f; if (trackMessageData.lightColorRGB) { rgbCycleCoroutine = ((MonoBehaviour)this).StartCoroutine(RGBCycleLight()); } } nextMessageTime = Time.time + trackData.messageFrequency + Random.Range(0f - trackData.messageRandomness, trackData.messageRandomness); currentTrack = index; } [IteratorStateMachine(typeof(<FadeIn>d__56))] private IEnumerator FadeIn() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <FadeIn>d__56(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<FadeOut>d__57))] private IEnumerator FadeOut() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <FadeOut>d__57(0) { <>4__this = this }; } [IteratorStateMachine(typeof(<RGBCycleLight>d__58))] private IEnumerator RGBCycleLight() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <RGBCycleLight>d__58(0) { <>4__this = this }; } [PunRPC] private void PlayPowerOnSoundRPC() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)powerOnSound?.clip != (Object)null) { AudioSource.PlayClipAtPoint(powerOnSound.clip, ((Component)this).transform.position, powerOnSound.volume); } } [PunRPC] private void SyncSpeakerEyeEffect(string playerName, float[] eyeRGBA, float[] pupilRGBA, float intensity, float pupilSize, float duration) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) Color eyeColor = default(Color); ((Color)(ref eyeColor))..ctor(eyeRGBA[0], eyeRGBA[1], eyeRGBA[2], eyeRGBA[3]); Color pupilColor = default(Color); ((Color)(ref pupilColor))..ctor(pupilRGBA[0], pupilRGBA[1], pupilRGBA[2], pupilRGBA[3]); EyeStateManager.Instance.SetEyeState(playerName, eyeColor, pupilColor, intensity, duration, eyeColorRGB: false, pupilColorRGB: false, pupilSize); } } public abstract class PaintedPostProcessingEffect { public float duration; public float intensity; public bool isActive; public abstract void ApplyEffect(PlayerAvatar player); public abstract void RemoveEffect(PlayerAvatar player); public virtual void UpdateEffect(PlayerAvatar player) { } } public class PaintedPostProcessing : MonoBehaviour { private static PaintedPostProcessing instance; private Dictionary<PlayerAvatar, List<PaintedPostProcessingEffect>> activeEffects = new Dictionary<PlayerAvatar, List<PaintedPostProcessingEffect>>(); private void Awake() { if ((Object)(object)instance == (Object)null) { instance = this; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); } else { Object.Destroy((Object)(object)((Component)this).gameObject); } } public static void ApplyEffect(PlayerAvatar player, PaintedPostProcessingEffect effect) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown PaintedPostProcessingEffect effect2 = effect; if ((Object)(object)instance == (Object)null) { GameObject val = new GameObject("PaintedPostProcessing"); instance = val.AddComponent<PaintedPostProcessing>(); } if (!instance.activeEffects.ContainsKey(player)) { instance.activeEffects[player] = new List<PaintedPostProcessingEffect>(); } PaintedPostProcessingEffect paintedPostProcessingEffect = instance.activeEffects[player].Find((PaintedPostProcessingEffect e) => e.GetType() == effect2.GetType()); if (paintedPostProcessingEffect != null) { paintedPostProcessingEffect.RemoveEffect(player); instance.activeEffects[player].Remove(paintedPostProcessingEffect); } instance.activeEffects[player].Add(effect2); effect2.ApplyEffect(player); } public static void RemoveEffect(PlayerAvatar player, PaintedPostProcessingEffect effect) { if (!((Object)(object)instance == (Object)null) && instance.activeEffects.ContainsKey(player)) { effect.RemoveEffect(player); instance.activeEffects[player].Remove(effect); } } private void Update() { foreach (KeyValuePair<PlayerAvatar, List<PaintedPostProcessingEffect>> activeEffect in activeEffects) { PaintedPostProcessingEffect[] array = activeEffect.Value.ToArray(); foreach (PaintedPostProcessingEffect paintedPostProcessingEffect in array) { if (paintedPostProcessingEffect.duration > 0f) { paintedPostProcessingEffect.duration -= Time.deltaTime; paintedPostProcessingEffect.UpdateEffect(activeEffect.Key); if (paintedPostProcessingEffect.duration <= 0f) { paintedPostProcessingEffect.RemoveEffect(activeEffect.Key); activeEffect.Value.Remove(paintedPostProcessingEffect); } } } } } } [Serializable] public class PlayerEvent : UnityEvent<PhysGrabber> { } [Serializable] public class TimerEvent { public string name; public float interval = 1f; public bool onlyWhenGrabbed = false; public PlayerEvent onTimer; } [Serializable] public class UseEvent { public string name; public bool useCustomKey = false; public KeyCode customKey = (KeyCode)101; public bool canUseWhenNotGrabbed = false; public PlayerEvent onUse; } public class PaintedUtilItemEvents : MonoBehaviour { [CompilerGenerated] private sealed class <TimerRoutine>d__11 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public TimerEvent timerEvent; public PaintedUtilItemEvents <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TimerRoutine>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; if (!timerEvent.onlyWhenGrabbed || <>4__this.wasGrabbed) { ((UnityEvent<PhysGrabber>)(object)timerEvent.onTimer).Invoke(Object.FindObjectOfType<PhysGrabber>()); } break; } <>2__current = (object)new WaitForSeconds(timerEvent.interval); <>1__state = 1; return true; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [Header("Grab Events")] public PlayerEvent onGrabbed; public PlayerEvent onReleased; [Header("Use Events")] public List<UseEvent> useEvents = new List<UseEvent>(); [Header("Timer Events")] public List<TimerEvent> timerEvents = new List<TimerEvent>(); private List<Coroutine> timerCoroutines = new List<Coroutine>(); private PhysGrabObject grabObject; private bool wasGrabbed = false; private void Awake() { grabObject = ((Component)this).GetComponent<PhysGrabObject>(); if ((Object)(object)grabObject == (Object)null) { Debug.LogWarning((object)("PaintedUtilItemEvents on " + ((Object)((Component)this).gameObject).name + " requires a PhysGrabObject component!")); ((Behaviour)this).enabled = false; } else { StartAllTimers(); } } private void Update() { //IL_0089: Unknown result type (might be due to invalid IL or missing references) if (grabObject.grabbedLocal != wasGrabbed) { wasGrabbed = grabObject.grabbedLocal; if (wasGrabbed) { ((UnityEvent<PhysGrabber>)(object)onGrabbed).Invoke(Object.FindObjectOfType<PhysGrabber>()); } else { ((UnityEvent<PhysGrabber>)(object)onReleased).Invoke(Object.FindObjectOfType<PhysGrabber>()); } } foreach (UseEvent useEvent in useEvents) { if (useEvent.useCustomKey ? Input.GetKeyDown(useEvent.customKey) : SemiFunc.InputDown((InputKey)2)) { if (wasGrabbed) { ((UnityEvent<PhysGrabber>)(object)useEvent.onUse).Invoke(Object.FindObjectOfType<PhysGrabber>()); } else if (useEvent.canUseWhenNotGrabbed && IsPlayerLookingAtAndInRange()) { ((UnityEvent<PhysGrabber>)(object)useEvent.onUse).Invoke(Object.FindObjectOfType<PhysGrabber>()); } } } } private bool IsPlayerLookingAtAndInRange() { //IL_0037: 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) PhysGrabber val = Object.FindObjectOfType<PhysGrabber>(); if ((Object)(object)val == (Object)null) { return false; } if ((Object)(object)val.currentlyLookingAtPhysGrabObject != (Object)(object)grabObject) { return false; } float num = Vector3.Distance(((Component)val).transform.position, ((Component)this).transform.position); return num <= val.grabRange; } private void StartAllTimers() { foreach (TimerEvent timerEvent in timerEvents) { if (timerEvent.interval > 0f) { Coroutine item = ((MonoBehaviour)this).StartCoroutine(TimerRoutine(timerEvent)); timerCoroutines.Add(item); } } } [IteratorStateMachine(typeof(<TimerRoutine>d__11))] private IEnumerator TimerRoutine(TimerEvent timerEvent) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TimerRoutine>d__11(0) { <>4__this = this, timerEvent = timerEvent }; } private void OnDestroy() { foreach (Coroutine timerCoroutine in timerCoroutines) { if (timerCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(timerCoroutine); } } timerCoroutines.Clear(); } } [CreateAssetMenu(menuName = "PaintedUtils/Rarity")] public class Rarity : ScriptableObject { [Serializable] public class Sound { public AudioClip clip; public float volume = 1f; [Range(0f, 3f)] public float pitch = 1f; [Range(0f, 1f)] public float volumeRandom = 0f; [Range(0f, 1f)] public float pitchRandom = 0f; [Range(0f, 1f)] public float spatialBlend = 1f; [Range(-3f, 3f)] public float doppler = 1f; [Range(0f, 10f)] public float reverbMix = 1f; public float falloffMultiplier = 1f; public int channel = 0; } public string rarityName; public ParticleSystem spawnEffect; public bool overrideEffectColor = false; public Color overrideColor = Color.white; public bool disableEffectOnGrab = false; public Sound spawnSound; public Color uiColor = Color.white; public Sprite icon; public void InitializeAudioSource(GameObject gameObject) { AudioSource val = gameObject.AddComponent<AudioSource>(); val.clip = spawnSound.clip; val.volume = spawnSound.volume * Random.Range(1f - spawnSound.volumeRandom, 1f); val.pitch = spawnSound.pitch * Random.Range(1f - spawnSound.pitchRandom, 1f); val.spatialBlend = spawnSound.spatialBlend; val.dopplerLevel = spawnSound.doppler; val.reverbZoneMix = spawnSound.reverbMix; val.rolloffMode = (AudioRolloffMode)2; val.maxDistance = 50f * spawnSound.falloffMultiplier; val.Play(); } } public class RarityEffectHandle { public ParticleSystem particleSystem; public GameObject particleGameObject; public AudioSource audioSource; public void DisableEffects() { if ((Object)(object)particleSystem != (Object)null) { particleSystem.Stop(true, (ParticleSystemStopBehavior)0); } if ((Object)(object)particleGameObject != (Object)null) { Object.Destroy((Object)(object)particleGameObject); } } } public static class RarityEffectManager { public static RarityEffectHandle TryPlayEffects(Rarity rarity, Vector3 position, Transform parent = null) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) RarityEffectHandle rarityEffectHandle = new RarityEffectHandle(); if ((Object)(object)rarity.spawnEffect != (Object)null) { ParticleSystem val = Object.Instantiate<ParticleSystem>(rarity.spawnEffect, position, Quaternion.identity, parent); ((Component)val).transform.up = Vector3.up; val.Play(); rarityEffectHandle.particleSystem = val; rarityEffectHandle.particleGameObject = ((Component)val).gameObject; if (rarity.overrideEffectColor) { ApplyColorOverrideToEffect(((Component)val).gameObject, rarity); } if (rarity.disableEffectOnGrab && (Object)(object)parent != (Object)null) { RarityEffectTracker rarityEffectTracker = ((Component)parent).gameObject.AddComponent<RarityEffectTracker>(); rarityEffectTracker.effectHandle = rarityEffectHandle; if ((Object)(object)((Component)parent).gameObject.GetComponent<PhysGrabObject>() != (Object)null) { ((Component)parent).gameObject.AddComponent<RarityGrabEffectHandler>(); } } } if (rarity.spawnSound != null && (Object)(object)rarity.spawnSound.clip != (Object)null) { rarity.InitializeAudioSource(rarityEffectHandle.particleGameObject); } return rarityEffectHandle; } private static void ApplyColorOverrideToEffect(GameObject targetEffectInstance, Rarity rarity) { //IL_0031: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)targetEffectInstance == (Object)null || (Object)(object)rarity == (Object)null) { return; } ParticleSystem[] componentsInChildren = targetEffectInstance.GetComponentsInChildren<ParticleSystem>(true); ParticleSystem[] array = componentsInChildren; foreach (ParticleSystem val in array) { MainModule main = val.main; if (rarity.overrideEffectColor) { ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(rarity.overrideColor); } } } } public class RarityEffectTracker : MonoBehaviour { public RarityEffectHandle effectHandle; public void DisableRarityEffects() { effectHandle?.DisableEffects(); } } public class RarityGrabEffectHandler : MonoBehaviour { private RarityEffectTracker tracker; private PhysGrabObject grabObject; private bool wasGrabbed = false; private void Awake() { tracker = ((Component)this).GetComponent<RarityEffectTracker>(); grabObject = ((Component)this).GetComponent<PhysGrabObject>(); } private void Update() { if (!((Object)(object)tracker == (Object)null) && !((Object)(object)grabObject == (Object)null) && grabObject.grabbedLocal != wasGrabbed) { wasGrabbed = grabObject.grabbedLocal; if (wasGrabbed) { tracker.DisableRarityEffects(); } } } } [Serializable] public class TrackMessageData { public List<string> messages = new List<string>(); public Rarity.Sound? sound; [Header("Eye Effects")] [Tooltip("Color of the eyes during TTS")] public Color eyeColor = Color.white; [Tooltip("Color of the pupils during TTS")] public Color pupilColor = Color.black; [Range(0.1f, 5f)] [Tooltip("Size of the pupils during TTS")] public float pupilSize = 3f; [Header("Speaker Light")] [Tooltip("Color of the speaker light")] public Color lightColor = Color.white; [Tooltip("If true, light will cycle through rainbow colors")] public bool lightColorRGB