Decompiled source of Blackjack Sofia v1.1.4
Blackjack_Contraband.dll
Decompiled a month 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.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using AOT; using Atlas.MappingComponents.Sandbox; using BepInEx; using BepInEx.Logging; using CustomScripts; using CustomScripts.Gamemode; using CustomScripts.Gamemode.GMDebug; using CustomScripts.Managers; using CustomScripts.Objects; using CustomScripts.Objects.Weapons; using CustomScripts.Objects.Windows; using CustomScripts.Player; using CustomScripts.Powerups; using CustomScripts.Zombie; using FistVR; using GunGame.Scripts; using GunGame.Scripts.Options; using GunGame.Scripts.Weapons; using HarmonyLib; using LuxWater; using OtherLoader; using Plawius.NonConvexCollider; using ProBuilder2.Common; using ProBuilder2.MeshOperations; using Sodalite.Api; using Sodalite.Utilities; using UnityEditor; using UnityEngine; using UnityEngine.AI; using UnityEngine.Assertions; using UnityEngine.Events; using UnityEngine.Profiling; using UnityEngine.Rendering; using UnityEngine.SceneManagement; using UnityEngine.Serialization; using UnityEngine.UI; using Valve.VR; [assembly: AssemblyTitle("CustomScripts")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("CustomScripts")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7ac675fa-8ffe-4c1b-8787-a764e1845c24")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace CustomScripts { [RequireComponent(typeof(IPurchasable))] public class CanPurchaseTextChanger : MonoBehaviour { private IPurchasable _purchasable; private IRequiresPower _requiresPower; [SerializeField] private List<Text> _texts; private void Start() { _purchasable = ((Component)this).GetComponent<IPurchasable>(); _requiresPower = ((Component)this).GetComponent<IRequiresPower>(); GameManager.OnPointsChanged = (Action)Delegate.Combine(GameManager.OnPointsChanged, new Action(UpdateTexts)); GameManager.OnPowerEnabled = (Action)Delegate.Combine(GameManager.OnPowerEnabled, new Action(UpdateTexts)); UpdateTexts(); } private void UpdateTexts() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) if (_requiresPower != null && !_requiresPower.IsPowered) { for (int i = 0; i < _texts.Count; i++) { _texts[i].text = "No power"; ((Graphic)_texts[i]).color = MonoBehaviourSingleton<GameReferences>.Instance.CannotBuyColor; } } else if (_purchasable.IsOneTimeOnly && _purchasable.AlreadyBought) { for (int j = 0; j < _texts.Count; j++) { _texts[j].text = "Out of stock"; ((Graphic)_texts[j]).color = MonoBehaviourSingleton<GameReferences>.Instance.CannotBuyColor; } } else if (MonoBehaviourSingleton<GameManager>.Instance.Points >= _purchasable.PurchaseCost) { for (int k = 0; k < _texts.Count; k++) { Text obj = _texts[k]; string text = _purchasable.PurchaseCost.ToString(); _texts[k].text = text; obj.text = text; ((Graphic)_texts[k]).color = MonoBehaviourSingleton<GameReferences>.Instance.CanBuyColor; } } else { for (int l = 0; l < _texts.Count; l++) { Text obj2 = _texts[l]; string text = _purchasable.PurchaseCost.ToString(); _texts[l].text = text; obj2.text = text; ((Graphic)_texts[l]).color = MonoBehaviourSingleton<GameReferences>.Instance.CannotBuyColor; } } } private void OnDestroy() { GameManager.OnPointsChanged = (Action)Delegate.Remove(GameManager.OnPointsChanged, new Action(UpdateTexts)); GameManager.OnPowerEnabled = (Action)Delegate.Remove(GameManager.OnPowerEnabled, new Action(UpdateTexts)); } } } namespace CustomScripts.Gamemode.GMDebug { public class CheatItemSpawner : MonoBehaviour { private void Awake() { RoundManager.OnGameStarted = (Action)Delegate.Combine(RoundManager.OnGameStarted, new Action(TrySpawning)); } private void OnDrawGizmos() { //IL_0015: 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) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) Gizmos.color = new Color(0.4f, 0.4f, 0.9f, 0.5f); Gizmos.matrix = ((Component)this).transform.localToWorldMatrix; Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(0f, 0.7f, 0.25f); Vector3 val2 = default(Vector3); ((Vector3)(ref val2))..ctor(2.3f, 1.2f, 0.5f); Vector3 forward = Vector3.forward; Gizmos.DrawCube(val, val2); Gizmos.DrawLine(val, val + forward * 0.5f); } public void TrySpawning() { if (GameSettings.ItemSpawnerEnabled) { ((MonoBehaviour)this).StartCoroutine(InitializeAsync()); } } private IEnumerator InitializeAsync() { yield return null; Scene sceneByName = SceneManager.GetSceneByName("ModBlank_Simple"); GameObject[] rootGameObjects = ((Scene)(ref sceneByName)).GetRootGameObjects(); GameObject itemSpawner = rootGameObjects.First((GameObject x) => ((Object)x).name == "ItemSpawner"); Object.Instantiate<GameObject>(itemSpawner, ((Component)this).transform.position, ((Component)this).transform.rotation).SetActive(true); Object.Destroy((Object)(object)this); } private void OnDestroy() { RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(TrySpawning)); } } } namespace CustomScripts { public static class Delegates { public delegate void VoidDelegate(); } public static class Extensions { public static void Shuffle<T>(this IList<T> list) { Random random = new Random(); int num = list.Count; while (num > 1) { num--; int index = random.Next(num + 1); T value = list[index]; list[index] = list[num]; list[num] = value; } } } public interface IModifier { void ApplyModifier(); } public interface IPowerUp : IModifier { void Spawn(Vector3 pos); } public abstract class PowerUp : MonoBehaviour, IPowerUp, IModifier { public AudioClip ApplyAudio; public abstract void ApplyModifier(); public abstract void Spawn(Vector3 pos); } public interface IPurchasable { int PurchaseCost { get; } bool IsOneTimeOnly { get; } bool AlreadyBought { get; } } public interface IRequiresPower { bool IsPowered { get; } } public interface ITrap { void OnEnemyEntered(ZombieController controller); } public class MonoBehaviourSingleton<T> : MonoBehaviour where T : Component { public static T Instance { get; private set; } public virtual void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = (T)(object)((this is T) ? this : null); } else { Object.Destroy((Object)(object)((Component)this).gameObject); } } } public class StartSpawner : MonoBehaviour { public ItemSpawner WeaponSpawner; public ItemSpawner AmmoSpawner; public void Spawn() { WeaponSpawner.SpawnItem(); AmmoSpawner.SpawnItem(); if (GameSettings.LimitedAmmo) { AmmoSpawner.SpawnItem(); AmmoSpawner.SpawnItem(); } } } } public class CustomDebug : GunGame.Scripts.MonoBehaviourSingleton<CustomDebug> { public Text DebugWeaponText; public Text DebugAmmoText; } namespace CustomScripts.Gamemode.GMDebug { public class CustomItemSpawner : MonoBehaviour { public string ObjectId; [HideInInspector] public GameObject SpawnedObject; private void OnDrawGizmos() { //IL_0015: 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) //IL_002f: Unknown result type (might be due to invalid IL or missing references) Gizmos.color = new Color(0f, 0f, 0.6f, 0.5f); Gizmos.matrix = ((Component)this).transform.localToWorldMatrix; Gizmos.DrawSphere(Vector3.zero, 0.1f); } public void Spawn() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) FVRObject val = IM.OD[ObjectId]; GameObject gameObject = ((AnvilAsset)val).GetGameObject(); GameObject val2 = Object.Instantiate<GameObject>(gameObject, ((Component)this).transform.position, ((Component)this).transform.rotation); val2.SetActive(true); SpawnedObject = val2; } } } namespace GunGame.Scripts { public class CustomSosigSpawner : MonoBehaviour { public SosigEnemyID SosigType; public SosigOrder SpawnState; public int IFF; public Sosig Spawn() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0010: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) SpawnOptions val = new SpawnOptions(); val.SpawnActivated = true; val.SpawnState = SpawnState; val.IFF = IFF; val.SpawnWithFullAmmo = true; val.EquipmentMode = (EquipmentSlots)7; val.SosigTargetPosition = ((Component)this).transform.position; val.SosigTargetRotation = ((Component)this).transform.eulerAngles; SpawnOptions val2 = val; SosigEnemyTemplate val3 = ManagerSingleton<IM>.Instance.odicSosigObjsByID[SosigType]; return SosigAPI.Spawn(val3, val2, ((Component)this).transform.position, ((Component)this).transform.rotation); } private void OnDrawGizmos() { //IL_0015: 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) //IL_003a: 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) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) Gizmos.color = new Color(0.8f, 0.2f, 0.2f, 0.5f); Gizmos.DrawSphere(((Component)this).transform.position, 0.1f); Gizmos.DrawLine(((Component)this).transform.position, ((Component)this).transform.position + ((Component)this).transform.forward * 0.25f); } } } public class DisableOnAwake : MonoBehaviour { private void Awake() { ((Component)this).gameObject.SetActive(false); } } public class DoorBanging : MonoBehaviour { public AudioSource BangingSound; private float _timer; private bool _activated; private void Awake() { if (Random.Range(0, 20) != 0) { Object.Destroy((Object)(object)this); return; } RoundManager.OnGameStarted = (Action)Delegate.Combine(RoundManager.OnGameStarted, new Action(OnGameStart)); _timer = Time.time; } private void Update() { if (!_activated && _timer + 120f <= Time.time) { BangingSound.Play(); _activated = true; } } public void OnGameStart() { Object.Destroy((Object)(object)this); } private void OnDestroy() { RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(OnGameStart)); } } namespace GunGame.Scripts { public class EndArea : MonoBehaviour { public Text TimeText; public Text KillsText; public Text DeathsText; public Transform EndPos; public void EndGame() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) GM.CurrentMovementManager.TeleportToPoint(EndPos.position, true, ((Component)this).transform.position + ((Component)this).transform.forward); foreach (Transform playerSpawner in MonoBehaviourSingleton<GameManager>.Instance.PlayerSpawners) { ((Component)playerSpawner).transform.position = EndPos.position; } KillsText.text = "Kills: " + MonoBehaviourSingleton<GameManager>.Instance.Kills; DeathsText.text = "Deaths: " + MonoBehaviourSingleton<GameManager>.Instance.Deaths; TimeSpan timeSpan = TimeSpan.FromSeconds(MonoBehaviourSingleton<GameManager>.Instance.GameTime); TimeText.text = "Time: " + timeSpan.Hours.ToString("00") + ":" + timeSpan.Minutes.ToString("00") + ":" + timeSpan.Seconds.ToString("00"); } } } namespace CustomScripts.Gamemode.GMDebug { public class ErrorShower : MonoBehaviourSingleton<ErrorShower> { public Text ErrorText; public void Show(string message) { ErrorText.text = message; ((Component)ErrorText).gameObject.SetActive(true); } } } namespace GunGame.Scripts { public class GameManager : MonoBehaviourSingleton<GameManager> { [HideInInspector] public int Kills; [HideInInspector] public int Deaths; [HideInInspector] public bool GameEnded; public EndArea EndArea; public static Action BeforeGameStartedEvent; public static Action GameStartedEvent; public PlayerSpawner PlayerSpawner; public List<Transform> PlayerSpawners; private Progression _progression; private Harmony _harmony; private float _timer; public float GameTime => Time.time - _timer; public override void Awake() { base.Awake(); _progression = ((Component)this).GetComponent<Progression>(); _harmony = Harmony.CreateAndPatchAll(typeof(PlayerSpawner), (string)null); _harmony.PatchAll(typeof(SosigBehavior)); _harmony.PatchAll(typeof(Progression)); } public void StartGame() { GameEnded = false; if (BeforeGameStartedEvent != null) { BeforeGameStartedEvent(); } _progression.SpawnAndEquip(); PlayerSpawner.MovePlayerToRandomSpawn(); if (GameStartedEvent != null) { GameStartedEvent(); } _timer = Time.time; } public void RemovePausedTime(float timePaused) { _timer += timePaused; } public void EndGame() { EndArea.EndGame(); GameEnded = true; } public void DebugAdvanceWeapon() { _progression.Promote(); } public void DebugPreviousWeapon() { _progression.Demote(); } public void DebugTeleport() { PlayerSpawner.MovePlayerToRandomSpawn(); } public void DebugStart() { if (BeforeGameStartedEvent != null) { BeforeGameStartedEvent(); } _progression.SpawnAndEquip(); if (GameStartedEvent != null) { GameStartedEvent(); } _timer = Time.time; } private void OnDestroy() { _harmony.UnpatchSelf(); } } } namespace CustomScripts { public class EndPanel : MonoBehaviourSingleton<EndPanel> { public Text TotalPointsText; public Text BestPointsText; public Text KillsText; public Text DifficultyText; public Text EnemiesTypeText; public Text LimitedAmmoText; public Text SpecialRoundsText; public Text LessZombieHPText; public void UpdatePanel() { TotalPointsText.text = "Total Points:\n" + MonoBehaviourSingleton<GameManager>.Instance.TotalPoints; BestPointsText.text = "High Score:\n" + MonoBehaviourSingleton<SaveSystem>.Instance.GetHighscore(); KillsText.text = "Kills:\n" + MonoBehaviourSingleton<GameManager>.Instance.Kills; DifficultyText.text = ((!GameSettings.HardMode) ? "Normal" : "Hard"); EnemiesTypeText.text = ((!GameSettings.UseCustomEnemies) ? "Normal" : "Custom"); LimitedAmmoText.text = ((!GameSettings.LimitedAmmo) ? "No" : "Yes"); SpecialRoundsText.text = ((!GameSettings.SpecialRoundDisabled) ? "Yes" : "No"); LessZombieHPText.text = ((!GameSettings.WeakerEnemiesEnabled) ? "No" : "Yes"); } } } namespace CustomScripts.Gamemode.GMDebug { public class CustomDebug : MonoBehaviour { public Transform Point; public PowerUpCarpenter Carpenter; public PowerUpInstaKill InstaKill; public PowerUpDeathMachine DeathMachine; public PowerUpMaxAmmo MaxAmmo; public PowerUpDoublePoints DoublePoints; public PowerUpNuke Nuke; public Blockade TrapBlockade; public ElectroTrap ElectroTrap; public Teleport TeleportToSecondArea; public Teleport TeleportToMainArea; public DeadShotPerkBottle DeadShotPerkBottle; public LootPoolChoice newLootPool; private ZombieBodyPart part; public LootPoolChoice Choice1; public LootPoolChoice Choice2; private bool _forcingSpecialEnemy; private void Update() { //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown //IL_00c8: 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_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown((KeyCode)97)) { MonoBehaviourSingleton<GameSettings>.Instance.EnableCustomEnemiesClicked(); MonoBehaviourSingleton<RoundManager>.Instance.StartGame(); } if (Input.GetKeyDown((KeyCode)98) && MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies.Count > 0) { Damage val = new Damage(); val.Class = (DamageClass)1; val.Dam_Piercing += 1f; val.Dam_TotalKinetic = 60000f; val.hitNormal = Vector3.back; ((Component)MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies[0]).GetComponentInChildren<ZombieBodyPart>().Damage(val); part = ((Component)MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies[0]).GetComponentInChildren<ZombieBodyPart>(); } if (Input.GetKeyDown((KeyCode)99)) { Damage val2 = new Damage(); val2.Class = (DamageClass)1; val2.Dam_Piercing += 1f; val2.Dam_TotalKinetic = 60000f; val2.hitNormal = Vector3.back; part.Damage(val2); } if (Input.GetKeyDown((KeyCode)100)) { DeadShotPerkBottle.ApplyModifier(); } if (Input.GetKeyDown((KeyCode)101)) { ((MonoBehaviour)this).StartCoroutine(MonoBehaviourSingleton<PlayerData>.Instance.ActivateStun()); } if (Input.GetKeyDown((KeyCode)109)) { MonoBehaviourSingleton<GameManager>.Instance.AddPoints(300); } if (Input.GetKeyDown((KeyCode)107)) { TrapBlockade.Buy(); } if (Input.GetKeyDown((KeyCode)108)) { ElectroTrap.OnLeverPull(); } if (Input.GetKeyDown((KeyCode)47)) { MonoBehaviourSingleton<GameManager>.Instance.TurnOnPower(); } if (Input.GetKeyDown((KeyCode)105)) { TeleportToSecondArea.OnLeverPull(); } if (Input.GetKeyDown((KeyCode)111)) { TeleportToMainArea.OnLeverPull(); } if (Input.GetKeyDown((KeyCode)109)) { MonoBehaviourSingleton<GameSettings>.Instance.ToggleBackgroundMusic(); } if (Input.GetKeyDown((KeyCode)91)) { Choice1.ChangePoolToThis(); } if (Input.GetKeyDown((KeyCode)93)) { Choice2.ChangePoolToThis(); } } public void SpawnCarpenter() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) Carpenter.Spawn(Point.position); } public void SpawnInstaKill() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) InstaKill.Spawn(Point.position); } public void SpawnDeathMachine() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) DeathMachine.Spawn(Point.position); } public void SpawnMaxAmmo() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) MaxAmmo.Spawn(Point.position); } public void SpawnDoublePoints() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) DoublePoints.Spawn(Point.position); } public void SpawnNuke() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) Nuke.Spawn(Point.position); } public void KillRandom() { if (MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies.Count > 0) { MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies[0].OnHit(99999f); } } public void ToggleForceSpecialRound() { if (_forcingSpecialEnemy) { MonoBehaviourSingleton<RoundManager>.Instance.SpecialRoundInterval = 8; _forcingSpecialEnemy = false; } else { MonoBehaviourSingleton<RoundManager>.Instance.SpecialRoundInterval = 1; _forcingSpecialEnemy = true; } } } public class DebugDamagableShower : MonoBehaviour, IFVRDamageable { public Text Text; public Text LowestText; public Text HighestText; public float DamageSum; public float LowestDam; public float HighestDam; public void Damage(Damage dam) { DamageSum += dam.Dam_TotalKinetic; if (LowestDam < dam.Dam_TotalKinetic) { LowestDam = dam.Dam_TotalKinetic; } if (HighestDam > dam.Dam_TotalKinetic) { HighestDam = dam.Dam_TotalKinetic; } Text.text = "Kinetic: " + DamageSum; LowestText.text = "Lowest: " + LowestDam; HighestText.text = "Highest: " + HighestDam; } public void ResetData() { DamageSum = 0f; LowestDam = float.MaxValue; HighestDam = float.MinValue; Text.text = "Kinetic: " + 0; LowestText.text = "Lowest: " + 0; HighestText.text = "Highest: " + 0; } } public class MoveTest : MonoBehaviour { [FormerlySerializedAs("isMoving")] public bool IsMoving; public float Speed; private void Update() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //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_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) if (IsMoving) { Transform transform = ((Component)this).transform; transform.position += Vector3.forward * (Speed * Time.deltaTime); Transform transform2 = ((Component)MonoBehaviourSingleton<GameReferences>.Instance.Player).transform; transform2.position += Vector3.forward * (Speed * Time.deltaTime); } } public void StartMoving() { IsMoving = true; } } } namespace CustomScripts { public class GameReferences : MonoBehaviourSingleton<GameReferences> { public Color CanBuyColor; public Color CannotBuyColor; [HideInInspector] public List<Window> Windows; [HideInInspector] public Transform Player; [SerializeField] private Transform DebugPlayer; [HideInInspector] public Transform PlayerHead; [SerializeField] private Transform DebugPlayerHead; public override void Awake() { base.Awake(); Player = DebugPlayer; PlayerHead = DebugPlayerHead; Windows = Object.FindObjectsOfType<Window>().ToList(); } private IEnumerator Start() { while ((Object)(object)GM.CurrentPlayerBody == (Object)null) { yield return null; } Player = ((Component)GM.CurrentPlayerBody).transform; PlayerHead = ((Component)GM.CurrentPlayerBody.Head).transform; } public bool IsPlayerClose(Transform pos, float dist) { //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) return Vector3.Distance(pos.position, Player.position) <= dist; } } public class GameSettings : MonoBehaviourSingleton<GameSettings> { public static Action OnSettingsChanged; public static Action OnMusicSettingChanged; public LootPool DefaultLootPool; [HideInInspector] public LootPool CurrentLootPool; [HideInInspector] public List<LootPoolChoice> LootPoolChoices; public static bool HardMode; public static bool UseCustomEnemies; public static bool LimitedAmmo; public static bool SpecialRoundDisabled; public static bool ItemSpawnerEnabled; public static bool WeakerEnemiesEnabled; public static bool BackgroundMusic; public Text OptionDescriptionText; private void Start() { LootPoolChoices = Object.FindObjectsOfType<LootPoolChoice>().ToList(); if (LootPoolChoices.Count == 0) { Debug.LogError((object)"No LootPoolChoices in the scene, At least one component has to be present"); } if (Object.op_Implicit((Object)(object)DefaultLootPool)) { CurrentLootPool = DefaultLootPool; } else { CurrentLootPool = LootPoolChoices[0].LootPool; } if (Object.op_Implicit((Object)(object)CurrentLootPool)) { foreach (LootPoolChoice lootPoolChoice in LootPoolChoices) { if ((Object)(object)lootPoolChoice.LootPool == (Object)(object)CurrentLootPool) { lootPoolChoice.IsEnabled = true; } } } OptionDescriptionText.text = "Call of Duty\nZOMBIES"; if (Random.Range(0, 500) == 0) { switch (Random.Range(0, 7)) { case 0: OptionDescriptionText.text = "You are my sunshine,\nMy only sunshine"; break; case 1: OptionDescriptionText.text = "I missed you"; break; case 2: OptionDescriptionText.text = "Play with me"; break; case 3: OptionDescriptionText.text = "It's just a game, mostly"; break; case 4: OptionDescriptionText.text = "I have granted kids to hell"; break; case 5: OptionDescriptionText.text = "It's only partially your fault"; break; } } } public void RestoreDefaultSettings() { HardMode = false; LimitedAmmo = false; UseCustomEnemies = false; ItemSpawnerEnabled = false; SpecialRoundDisabled = false; WeakerEnemiesEnabled = false; OptionDescriptionText.text = "Default settings restored."; if (OnSettingsChanged != null) { OnSettingsChanged(); } } public void DifficultyNormalClicked() { HardMode = false; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Normal mode: Normal Enemy speed, HP and numbers."; } public void DifficultyHardClicked() { HardMode = true; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Hard mode: Increased Enemy speed, HP and numbers."; } public void EnableCustomEnemiesClicked() { UseCustomEnemies = true; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Custom humanoid enemies\n(Instead of Sosigs)."; } public void DisableCustomEnemiesClicked() { UseCustomEnemies = false; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Default Sosig zombies."; } public void EnableLimitedAmmoClicked() { LimitedAmmo = true; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Cannot use Spawnlock. Restore ammunition from Max Ammo power ups or buy it from a wall."; } public void DisableLimitedAmmoClicked() { LimitedAmmo = false; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Spawnlock enabled."; } public void EnableSpecialRoundClicked() { SpecialRoundDisabled = false; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Special round inspired by Hellhounds, occurs every 8 rounds."; } public void DisableSpecialRoundClicked() { SpecialRoundDisabled = true; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Special round disabled."; } public void EnableItemSpawnerClicked() { ItemSpawnerEnabled = true; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Item Spawner will appear at the starting location. Scoring will be disabled for that game."; } public void DisableItemSpawnerClicked() { ItemSpawnerEnabled = false; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "No Item Spawner. Scoring enabled"; } public void EnableWeakerEnemiesClicked() { WeakerEnemiesEnabled = true; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Enemies have reduced HP"; } public void DisableWeakerEnemiesClicked() { WeakerEnemiesEnabled = false; if (OnSettingsChanged != null) { OnSettingsChanged(); } OptionDescriptionText.text = "Enemies have normal HP"; } public void ToggleBackgroundMusic() { BackgroundMusic = !BackgroundMusic; if (OnMusicSettingChanged != null) { OnMusicSettingChanged(); } if (OnSettingsChanged != null) { OnSettingsChanged(); } } public void ChangeLootPool(LootPoolChoice newLootPool) { foreach (LootPoolChoice lootPoolChoice in LootPoolChoices) { lootPoolChoice.IsEnabled = false; } newLootPool.IsEnabled = true; CurrentLootPool = newLootPool.LootPool; if (OnSettingsChanged != null) { OnSettingsChanged(); } } } public class GameSettingsPanel : MonoBehaviour { public Text BackgroundMusic; public Text DifficultyNormalText; public Text DifficultyHardText; public Text CustomEnemiesEnabledText; public Text CustomEnemiesDisabledText; public Text LimitedAmmoEnabledText; public Text LimitedAmmoDisabledText; public Text SpecialRoundEnabledText; public Text SpecialRoundDisabledText; public Text ItemSpawnerEnabledText; public Text ItemSpawnerDisabledText; public Text WeakerZombiesEnabledText; public Text WeakerZombiesDisabledText; public Color EnabledColor; public Color DisabledColor; private void Awake() { GameSettings.OnSettingsChanged = (Action)Delegate.Combine(GameSettings.OnSettingsChanged, new Action(UpdateText)); } private void Start() { UpdateText(); } private void OnDestroy() { GameSettings.OnSettingsChanged = (Action)Delegate.Remove(GameSettings.OnSettingsChanged, new Action(UpdateText)); } private void UpdateText() { //IL_0041: 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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_018c: 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_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: 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_0229: Unknown result type (might be due to invalid IL or missing references) //IL_021e: Unknown result type (might be due to invalid IL or missing references) BackgroundMusic.text = ((!GameSettings.BackgroundMusic) ? "Disabled" : "Enabled"); ((Graphic)DifficultyNormalText).color = ((!GameSettings.HardMode) ? EnabledColor : DisabledColor); ((Graphic)DifficultyHardText).color = ((!GameSettings.HardMode) ? DisabledColor : EnabledColor); ((Graphic)CustomEnemiesEnabledText).color = ((!GameSettings.UseCustomEnemies) ? DisabledColor : EnabledColor); ((Graphic)CustomEnemiesDisabledText).color = ((!GameSettings.UseCustomEnemies) ? EnabledColor : DisabledColor); ((Graphic)LimitedAmmoEnabledText).color = ((!GameSettings.LimitedAmmo) ? DisabledColor : EnabledColor); ((Graphic)LimitedAmmoDisabledText).color = ((!GameSettings.LimitedAmmo) ? EnabledColor : DisabledColor); ((Graphic)SpecialRoundEnabledText).color = ((!GameSettings.SpecialRoundDisabled) ? EnabledColor : DisabledColor); ((Graphic)SpecialRoundDisabledText).color = ((!GameSettings.SpecialRoundDisabled) ? DisabledColor : EnabledColor); ((Graphic)ItemSpawnerEnabledText).color = ((!GameSettings.ItemSpawnerEnabled) ? DisabledColor : EnabledColor); ((Graphic)ItemSpawnerDisabledText).color = ((!GameSettings.ItemSpawnerEnabled) ? EnabledColor : DisabledColor); ((Graphic)WeakerZombiesEnabledText).color = ((!GameSettings.WeakerEnemiesEnabled) ? DisabledColor : EnabledColor); ((Graphic)WeakerZombiesDisabledText).color = ((!GameSettings.WeakerEnemiesEnabled) ? EnabledColor : DisabledColor); foreach (LootPoolChoice lootPoolChoice in MonoBehaviourSingleton<GameSettings>.Instance.LootPoolChoices) { ((Graphic)lootPoolChoice.LootChoiceText).color = ((!lootPoolChoice.IsEnabled) ? DisabledColor : EnabledColor); } } } public class GameStart : MonoBehaviourSingleton<GameStart> { private void OnDrawGizmos() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) Gizmos.color = Color.red; Gizmos.DrawSphere(((Component)this).transform.position, 0.5f); } } public class HighscoreShower : MonoBehaviour { public Text HighscoreText; private void Start() { HighscoreText.text = "Highscore:\n" + MonoBehaviourSingleton<SaveSystem>.Instance.GetHighscore(); } } public class LeverWrapper : MonoBehaviour { public UnityEvent LeverToggleEvent; public UnityEvent LeverOnEvent; public UnityEvent LeverOffEvent; public UnityEvent LeverHoldStartEvent; public UnityEvent LeverHoldEndEvent; private TrapLever _lever; private bool _isOn; private bool _isHeld; private void Awake() { _lever = ((Component)this).GetComponentInChildren<TrapLever>(); _lever.MessageTargets.Add(((Component)this).gameObject); } private void Update() { if (!_isHeld && ((FVRInteractiveObject)_lever).IsHeld) { OnHoldStart(); } else if (_isHeld && !((FVRInteractiveObject)_lever).IsHeld) { OnHoldEnd(); } } private void OnHoldStart() { _isHeld = true; if (LeverHoldStartEvent != null) { LeverHoldStartEvent.Invoke(); } } private void OnHoldEnd() { _isHeld = false; if (LeverHoldEndEvent != null) { LeverHoldEndEvent.Invoke(); } } public void ON() { if (!_isOn) { _isOn = true; if (LeverToggleEvent != null) { LeverToggleEvent.Invoke(); } if (LeverOnEvent != null) { LeverOnEvent.Invoke(); } } } public void OFF() { if (_isOn) { _isOn = false; if (LeverToggleEvent != null) { LeverToggleEvent.Invoke(); } if (LeverOffEvent != null) { LeverOffEvent.Invoke(); } } } } } namespace CustomScripts.Gamemode { public class PointsView : MonoBehaviour { public Text PointsText; private void Awake() { GameManager.OnPointsChanged = (Action)Delegate.Combine(GameManager.OnPointsChanged, new Action(OnPointsChanged)); } private void OnDestroy() { GameManager.OnPointsChanged = (Action)Delegate.Remove(GameManager.OnPointsChanged, new Action(OnPointsChanged)); } private void OnPointsChanged() { PointsText.text = "Points:\n" + MonoBehaviourSingleton<GameManager>.Instance.Points; } } } public class GunsLeftUI : MonoBehaviour { private Text _gunsLeftText; private void Awake() { _gunsLeftText = ((Component)this).GetComponent<Text>(); Progression.WeaponChangedEvent = (Action)Delegate.Combine(Progression.WeaponChangedEvent, new Action(UpdateUI)); } private void UpdateUI() { int num = Mathf.Min(GunGame.Scripts.Options.GameSettings.CurrentPool.Guns.Count, WeaponCountOption.WeaponCount); int num2 = GunGame.Scripts.MonoBehaviourSingleton<Progression>.Instance.CurrentWeaponId + 1; int num3 = num - num2; _gunsLeftText.text = "Guns left: " + num3; } private void OnDestroy() { Progression.WeaponChangedEvent = (Action)Delegate.Remove(Progression.WeaponChangedEvent, new Action(UpdateUI)); } } public class Location : MonoBehaviour { public List<Transform> ZombieSpawnPoints; public List<Transform> SpecialZombieSpawnPoints; private void Start() { if (ZombieSpawnPoints.Count == 0) { Debug.LogError((object)"ZombieSpawnPoints is empty, zombies don't have a place to spawn"); } if (SpecialZombieSpawnPoints.Count == 0) { Debug.LogError((object)"SpecialZombieSpawnPoints is empty, special zombies don't have a place to spawn"); } } } [CreateAssetMenu] public class LootPool : ScriptableObject { public string LootPoolTitle; [Header("Elements in the list corresponds to the ID of the Wallshops.")] public List<WeaponData> WallShopsPool; public List<WeaponData> MysteryBoxPool; public List<WeaponData> LimitedAmmoMysteryBoxPool; public HashSet<WeaponData> PackAPunchPool => GetPackAPunchPool(); public HashSet<WeaponData> GetPackAPunchPool() { HashSet<WeaponData> hashSet = new HashSet<WeaponData>(); foreach (WeaponData item in WallShopsPool) { hashSet.Add(item); } foreach (WeaponData item2 in MysteryBoxPool) { hashSet.Add(item2); } foreach (WeaponData item3 in LimitedAmmoMysteryBoxPool) { hashSet.Add(item3); } return hashSet; } } public class LootPoolChoice : MonoBehaviour { public LootPool LootPool; public Text LootChoiceText; [HideInInspector] public bool IsEnabled; private void Awake() { LootChoiceText.text = LootPool.LootPoolTitle; } public void ChangePoolToThis() { CustomScripts.MonoBehaviourSingleton<CustomScripts.GameSettings>.Instance.ChangeLootPool(this); IsEnabled = true; } } namespace CustomScripts.Gamemode { public class MagazineWrapper : MonoBehaviour { private FVRFireArmMagazine _magazine; private FVRFireArmClip _clip; private Speedloader _speedloader; public FireArmRoundClass RoundClass; public void Initialize(FVRFireArmMagazine magazine) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) _magazine = magazine; RoundClass = magazine.DefaultLoadingPattern.Classes[0]; } public void InitialzieWithAmmo(FVRFireArmMagazine magazine, FireArmRoundClass roundClass) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) _magazine = magazine; RoundClass = roundClass; } public void InitialzieWithAmmo(FVRFireArmClip clip, FireArmRoundClass roundClass) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) _clip = clip; RoundClass = roundClass; } public void InitialzieWithAmmo(Speedloader speedloader, FireArmRoundClass roundClass) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) _speedloader = speedloader; RoundClass = roundClass; } } } namespace CustomScripts { public class GameManager : MonoBehaviourSingleton<GameManager> { public static Action OnPointsChanged; public static Action OnPowerEnabled; [HideInInspector] public int Points; [HideInInspector] public int TotalPoints; [HideInInspector] public bool GameStarted = false; [HideInInspector] public bool GameEnded = false; public Transform StartGameWaypoint; public WallShop FirstShop; public bool PowerEnabled; [HideInInspector] public int Kills; private Harmony _harmony; public override void Awake() { base.Awake(); _harmony = Harmony.CreateAndPatchAll(typeof(PlayerData), (string)null); _harmony.PatchAll(typeof(PlayerSpawner)); _harmony.PatchAll(typeof(ZombieManager)); } public void TurnOnPower() { if (!PowerEnabled) { PowerEnabled = true; MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.PowerOnSound, 0.8f); if (OnPowerEnabled != null) { OnPowerEnabled(); } } } public void AddPoints(int amount) { float num = (float)amount * MonoBehaviourSingleton<PlayerData>.Instance.MoneyModifier; MonoBehaviourSingleton<PlayerData>.Instance.MoneyModifier.ToString(); amount = (int)num; Points += amount; TotalPoints += amount; if (OnPointsChanged != null) { OnPointsChanged(); } } public bool TryRemovePoints(int amount) { if (Points >= amount) { Points -= amount; if (OnPointsChanged != null) { OnPointsChanged(); } return true; } return false; } public void KillPlayer() { if (!GameEnded) { GM.CurrentPlayerBody.KillPlayer(false); } } public void EndGame() { if (!GameEnded) { GameEnded = true; MonoBehaviourSingleton<AudioManager>.Instance.PlayMusic(MonoBehaviourSingleton<AudioManager>.Instance.EndMusic, 0.25f, 1f); MonoBehaviourSingleton<EndPanel>.Instance.UpdatePanel(); if (!GameSettings.ItemSpawnerEnabled) { MonoBehaviourSingleton<SaveSystem>.Instance.SaveHighscore(TotalPoints); } } } private void OnDestroy() { _harmony.UnpatchSelf(); } } public class PowerUpManager : MonoBehaviourSingleton<PowerUpManager> { public float ChanceForAmmo = 2.5f; public float ChanceForPowerUp = 6f; public float AmmoCooldownTime; public float PowerUpCooldownTime; public PowerUpMaxAmmo MaxAmmo; public List<PowerUp> PowerUps; private readonly List<int> _randomIndexes = new List<int>(); private bool _isPowerUpCooldown; private bool _isMaxAmmoCooldown; public override void Awake() { base.Awake(); RoundManager.OnZombieKilled = (Action<GameObject>)Delegate.Remove(RoundManager.OnZombieKilled, new Action<GameObject>(RollForPowerUp)); RoundManager.OnZombieKilled = (Action<GameObject>)Delegate.Combine(RoundManager.OnZombieKilled, new Action<GameObject>(RollForPowerUp)); ShuffleIndexes(); } private void OnDestroy() { RoundManager.OnZombieKilled = (Action<GameObject>)Delegate.Remove(RoundManager.OnZombieKilled, new Action<GameObject>(RollForPowerUp)); } public void RollForPowerUp(GameObject spawnPos) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) float num = Random.Range(0f, 100f); if (GameSettings.LimitedAmmo && !_isMaxAmmoCooldown && num < ChanceForAmmo) { ((MonoBehaviour)this).StartCoroutine(PowerUpMaxAmmoCooldown()); SpawnPowerUp(MaxAmmo, spawnPos.transform.position); } else { if (_isPowerUpCooldown) { return; } num = Random.Range(0f, 100f); if (num < ChanceForPowerUp) { if (_randomIndexes.Count == 0) { ShuffleIndexes(); } ((MonoBehaviour)this).StartCoroutine(PowerUpMaxAmmoCooldown()); SpawnPowerUp(PowerUps[_randomIndexes[0]], spawnPos.transform.position); _randomIndexes.RemoveAt(0); } } } private void ShuffleIndexes() { _randomIndexes.Clear(); for (int i = 0; i < PowerUps.Count; i++) { _randomIndexes.Add(i); } _randomIndexes.Shuffle(); } public void SpawnPowerUp(PowerUp powerUp, Vector3 pos) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)powerUp == (Object)null) { Debug.LogWarning((object)"PowerUp spawn failed! PowerUp == null"); return; } ((MonoBehaviour)this).StartCoroutine(PowerUpCooldown()); powerUp.Spawn(pos + Vector3.up); } private IEnumerator PowerUpCooldown() { _isPowerUpCooldown = true; yield return (object)new WaitForSeconds(PowerUpCooldownTime); _isPowerUpCooldown = false; } private IEnumerator PowerUpMaxAmmoCooldown() { _isMaxAmmoCooldown = true; yield return (object)new WaitForSeconds(AmmoCooldownTime); _isMaxAmmoCooldown = false; } } public class RoundManager : MonoBehaviourSingleton<RoundManager> { public static Action RoundStarted; public static Action RoundEnded; public static Action OnRoundChanged; public static Action OnZombiesLeftChanged; public static Action<GameObject> OnZombieKilled; public static Action OnGameStarted; public int ZombieFastWalkRound = 2; public int ZombieRunRound = 6; public int HardModeFastWalkRound = 0; public int HardModeRunRound = 3; public int SpecialRoundInterval; [HideInInspector] public int RoundNumber = 0; private Coroutine _roundDelayCoroutine; public bool IsRoundSpecial { get { if (GameSettings.SpecialRoundDisabled) { return false; } return RoundNumber % SpecialRoundInterval == 0; } } public bool IsFastWalking { get { if (GameSettings.HardMode) { return RoundNumber >= HardModeFastWalkRound; } return RoundNumber >= ZombieFastWalkRound; } } public bool IsRunning { get { if (GameSettings.HardMode) { return RoundNumber >= HardModeRunRound; } return RoundNumber >= ZombieRunRound; } } public void StartGame() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (!Application.isEditor) { GM.CurrentMovementManager.TeleportToPoint(MonoBehaviourSingleton<GameManager>.Instance.StartGameWaypoint.position, true); GM.CurrentSceneSettings.IsSpawnLockingEnabled = !GameSettings.LimitedAmmo; } MonoBehaviourSingleton<GameManager>.Instance.GameStarted = true; RoundNumber = 0; AdvanceRound(); if (OnGameStarted != null) { OnGameStarted(); } if (Object.op_Implicit((Object)(object)MonoBehaviourSingleton<GameManager>.Instance.FirstShop)) { MonoBehaviourSingleton<GameManager>.Instance.FirstShop.IsFree = true; MonoBehaviourSingleton<GameManager>.Instance.FirstShop.TryBuying(); } } public void AdvanceRound() { if (!MonoBehaviourSingleton<GameManager>.Instance.GameEnded) { RoundNumber++; MonoBehaviourSingleton<ZombieManager>.Instance.BeginSpawningEnemies(); if (OnZombiesLeftChanged != null) { OnZombiesLeftChanged(); } if (OnRoundChanged != null) { OnRoundChanged(); } } } public void EndRound() { MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.RoundEndSound, 0.2f, 1f); if (RoundEnded != null) { RoundEnded(); } if (GameSettings.LimitedAmmo) { _roundDelayCoroutine = ((MonoBehaviour)this).StartCoroutine(DelayedAdvanceRound(20f)); } else { _roundDelayCoroutine = ((MonoBehaviour)this).StartCoroutine(DelayedAdvanceRound(17f)); } } private IEnumerator DelayedAdvanceRound(float delay) { yield return (object)new WaitForSeconds(delay); AdvanceRound(); if (RoundStarted != null) { RoundStarted(); } } public void PauseGame() { ((MonoBehaviour)this).StopCoroutine(_roundDelayCoroutine); } public void ResumeGame() { _roundDelayCoroutine = ((MonoBehaviour)this).StartCoroutine(DelayedAdvanceRound(0f)); } } public class AudioManager : MonoBehaviourSingleton<AudioManager> { public List<AudioClip> FarZombieSounds; public List<AudioClip> CloseZombieSounds; public List<AudioClip> HellHoundsSounds; public AudioSource MainAudioSource; public AudioSource MusicAudioSource; [Space(20f)] public AudioClip Music; public AudioClip BuySound; public AudioClip DrinkSound; public AudioClip ZombieHitSound; public AudioClip ZombieDeathSound; public AudioClip HellHoundSpawnSound; public AudioClip HellHoundDeathSound; public AudioClip RoundStartSound; public AudioClip RoundEndSound; public AudioClip HellHoundRoundStartSound; public AudioClip PowerOnSound; public AudioClip EndMusic; public AudioClip TeleportingSound; public AudioClip PlayerHitSound; public AudioClip BarricadeRepairSound; private Coroutine _musicRepetition; public override void Awake() { base.Awake(); GameSettings.OnMusicSettingChanged = (Action)Delegate.Combine(GameSettings.OnMusicSettingChanged, new Action(OnMusicSettingChanged)); } private void OnMusicSettingChanged() { if (GameSettings.BackgroundMusic) { PlayMusic(Music, 0.08f, 0f, repeat: true); } else { MusicAudioSource.Stop(); } } public void Play(AudioClip audioClip, float volume = 1f, float delay = 0f) { if (delay != 0f) { ((MonoBehaviour)this).StartCoroutine(PlayDelayed(audioClip, volume, delay)); } else { MainAudioSource.PlayOneShot(audioClip, volume); } } private IEnumerator PlayDelayed(AudioClip audioClip, float volume, float delay) { yield return (object)new WaitForSeconds(delay); MainAudioSource.PlayOneShot(audioClip, volume); } public void PlayMusic(AudioClip audioClip, float volume = 1f, float delay = 0f, bool repeat = false) { if (_musicRepetition != null) { ((MonoBehaviour)this).StopCoroutine(_musicRepetition); _musicRepetition = null; } MusicAudioSource.clip = audioClip; MusicAudioSource.volume = volume; MusicAudioSource.PlayDelayed(delay); if (repeat) { _musicRepetition = ((MonoBehaviour)this).StartCoroutine(RepeatMusic(audioClip.length, volume)); } } private IEnumerator RepeatMusic(float endTimer, float volume) { yield return (object)new WaitForSeconds(endTimer); if (GameSettings.BackgroundMusic) { PlayMusic(Music, 0.08f, 0f, repeat: true); } } private void OnDestroy() { GameSettings.OnMusicSettingChanged = (Action)Delegate.Remove(GameSettings.OnMusicSettingChanged, new Action(OnMusicSettingChanged)); } } } namespace CustomScripts.Managers.Sound { public class MusicManager : MonoBehaviourSingleton<MusicManager> { } } namespace CustomScripts { public class SoundPool : MonoBehaviour { public List<SoundPoolableObject> PooledAudioSources; public static SoundPool Instance { get; private set; } private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } } public SoundPoolableObject Spawn() { if (PooledAudioSources.Count <= 0) { return null; } SoundPoolableObject result = PooledAudioSources[0]; PooledAudioSources.RemoveAt(0); return result; } public void Despawn(SoundPoolableObject soundPoolable) { PooledAudioSources.Add(soundPoolable); } } public class SoundPoolableObject : MonoBehaviour { public AudioSource AudioSource; public float DespawnTime = 4f; public void Initialize() { AudioSource.Play(); ((MonoBehaviour)this).StartCoroutine(DespawnDelay()); } private IEnumerator DespawnDelay() { yield return (object)new WaitForSeconds(DespawnTime); SoundPool.Instance.Despawn(this); } } } namespace CustomScripts.Managers { public class ZombieManager : MonoBehaviourSingleton<ZombieManager> { public static Action LocationChangedEvent; public Location CurrentLocation; public ZombiePool NormalZombiePool; public ZombiePool SpecialZombiePool; public AnimationCurve ZombieCountCurve; public AnimationCurve CustomZombieHPCurve; public AnimationCurve ZosigHPCurve; public AnimationCurve ZosigLinkIntegrityCurve; public AnimationCurve ZosigPerRoundSpeed; public int CustomZombieDamage = 2000; public int PointsOnHit = 10; public int PointsOnKill = 100; public List<ZombieController> AllCustomZombies; [HideInInspector] public List<ZombieController> ExistingZombies; private Transform _zombieTarget; public ParticleSystem HellhoundExplosionPS; public int ZombieAtOnceLimit = 20; [HideInInspector] public int ZombiesRemaining; private Coroutine _spawningCoroutine; private int ZombiesToSpawnThisRound { get { if (GameSettings.HardMode) { return Mathf.CeilToInt(ZombieCountCurve.Evaluate((float)MonoBehaviourSingleton<RoundManager>.Instance.RoundNumber) + 1f); } return Mathf.CeilToInt(ZombieCountCurve.Evaluate((float)MonoBehaviourSingleton<RoundManager>.Instance.RoundNumber)); } } public void BeginSpawningEnemies() { ZombiesRemaining = ZombiesToSpawnThisRound; if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) { StartSpawningZombies(6f); MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.HellHoundRoundStartSound, 0.35f); } else { StartSpawningZombies(2f); MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.RoundStartSound, 0.2f, 1f); } } public void StartSpawningZombies(float initialDelay) { _spawningCoroutine = ((MonoBehaviour)this).StartCoroutine(DelayedZombieSpawn(initialDelay)); } public void OnZombieSpawned(ZombieController controller) { ((MonoBehaviour)this).StartCoroutine(DelayedCustomZombieSpawn(controller)); } private IEnumerator DelayedZombieSpawn(float delay) { yield return (object)new WaitForSeconds(delay); while (ZombiesRemaining > ExistingZombies.Count) { if (ExistingZombies.Count >= ZombieAtOnceLimit) { yield return (object)new WaitForSeconds(5f); continue; } _zombieTarget = MonoBehaviourSingleton<GameReferences>.Instance.Player; if (!GameSettings.UseCustomEnemies) { SpawnZosig(); } else if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) { SpecialZombiePool.Spawn(); } else { NormalZombiePool.Spawn(); } yield return (object)new WaitForSeconds(2f); } } private IEnumerator DelayedCustomZombieSpawn(ZombieController controller) { yield return null; Transform spawnPoint2 = null; spawnPoint2 = ((!MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) ? CurrentLocation.ZombieSpawnPoints[Random.Range(0, CurrentLocation.ZombieSpawnPoints.Count)] : ((Component)CurrentLocation.SpecialZombieSpawnPoints[Random.Range(0, CurrentLocation.SpecialZombieSpawnPoints.Count)]).transform); if ((Object)(object)((Component)spawnPoint2).GetComponent<ZombieSpawner>() != (Object)null) { Window windowWaypoint = ((Component)spawnPoint2).GetComponent<ZombieSpawner>().WindowWaypoint; if ((Object)(object)windowWaypoint != (Object)null) { _zombieTarget = windowWaypoint.ZombieWaypoint; } } ExistingZombies.Add(controller); if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) { ((Component)spawnPoint2).GetComponent<CustomSosigSpawnPoint>().SpawnPS.Play(true); if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) { MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.HellHoundSpawnSound, 0.4f, 0.25f); } yield return (object)new WaitForSeconds(2f); } if (ExistingZombies.Contains(controller)) { ((Component)controller).transform.position = spawnPoint2.position; controller.Initialize(_zombieTarget); if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) { controller.InitializeSpecialType(); } } } public void SpawnZosig() { if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) { CustomSosigSpawnPoint component = ((Component)CurrentLocation.SpecialZombieSpawnPoints[Random.Range(0, CurrentLocation.SpecialZombieSpawnPoints.Count)]).GetComponent<CustomSosigSpawnPoint>(); component.Spawn(); return; } CustomSosigSpawnPoint component2 = ((Component)CurrentLocation.ZombieSpawnPoints[Random.Range(0, CurrentLocation.ZombieSpawnPoints.Count)]).GetComponent<CustomSosigSpawnPoint>(); Window windowWaypoint = ((Component)component2).GetComponent<ZombieSpawner>().WindowWaypoint; if ((Object)(object)windowWaypoint != (Object)null) { _zombieTarget = windowWaypoint.ZombieWaypoint; } component2.Spawn(); } public void OnZosigSpawned(Sosig zosig) { ZombieController zombieController = ((Component)zosig).gameObject.AddComponent<ZosigZombieController>(); zombieController.Initialize(_zombieTarget); ExistingZombies.Add(zombieController); if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) { zombieController.InitializeSpecialType(); } } public void ChangeLocation(Location newLocation) { if (_spawningCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(_spawningCoroutine); } CurrentLocation = newLocation; for (int num = ExistingZombies.Count - 1; num >= 0; num--) { ExistingZombies[num].OnKill(awardPoints: false); } StartSpawningZombies(5f); if (LocationChangedEvent != null) { LocationChangedEvent(); } } public void OnZombieDied(ZombieController controller, bool awardKill = true) { //IL_0091: Unknown result type (might be due to invalid IL or missing references) MonoBehaviourSingleton<GameManager>.Instance.Kills++; if (GameSettings.UseCustomEnemies) { ((MonoBehaviour)this).StartCoroutine(DelayedCustomZombieDespawn(((Component)controller).GetComponent<CustomZombieController>())); } ExistingZombies.Remove(controller); if (!awardKill) { return; } ZombiesRemaining--; if (ZombiesRemaining <= 0) { if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial && GameSettings.LimitedAmmo) { MonoBehaviourSingleton<PowerUpManager>.Instance.SpawnPowerUp(MonoBehaviourSingleton<PowerUpManager>.Instance.MaxAmmo, ((Component)controller).transform.position); } MonoBehaviourSingleton<RoundManager>.Instance.EndRound(); } if (RoundManager.OnZombiesLeftChanged != null) { RoundManager.OnZombiesLeftChanged(); } if (RoundManager.OnZombieKilled != null) { RoundManager.OnZombieKilled(((Component)controller).gameObject); } } private IEnumerator DelayedCustomZombieDespawn(CustomZombieController controller) { if (MonoBehaviourSingleton<RoundManager>.Instance.IsRoundSpecial) { yield return (object)new WaitForSeconds(0f); SpecialZombiePool.Despawn(controller); } else { yield return (object)new WaitForSeconds(5f); NormalZombiePool.Despawn(controller); } } [HarmonyPatch(typeof(Sosig), "SosigDies")] [HarmonyPostfix] private static void OnSosigDied(Sosig __instance, DamageClass damClass, SosigDeathType deathType) { ((Component)__instance).GetComponent<ZosigZombieController>().OnKill(); } [HarmonyPatch(typeof(Sosig), "ProcessDamage", new Type[] { typeof(Damage), typeof(SosigLink) })] [HarmonyPrefix] private static void BeforeZombieHit(Damage d, SosigLink link) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 if ((int)d.Class == 3 && d.Source_IFF != GM.CurrentSceneSettings.DefaultPlayerIFF) { d.Dam_Blinding = 0f; d.Dam_TotalKinetic = 0f; d.Dam_TotalEnergetic = 0f; d.Dam_Blunt = 0f; d.Dam_Chilling = 0f; d.Dam_Cutting = 0f; d.Dam_Thermal = 0f; d.Dam_EMP = 0f; d.Dam_Piercing = 0f; d.Dam_Stunning = 0f; } } [HarmonyPatch(typeof(Sosig), "ProcessDamage", new Type[] { typeof(Damage), typeof(SosigLink) })] [HarmonyPostfix] private static void AfterZombieHit(Sosig __instance, Damage d, SosigLink link) { ((Component)__instance).GetComponent<ZosigZombieController>().OnHit(d); } } } namespace GunGame.Scripts { public class MonoBehaviourSingleton<T> : MonoBehaviour where T : Component { public static T Instance { get; private set; } public virtual void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = (T)(object)((this is T) ? this : null); } else { Object.Destroy((Object)(object)((Component)this).gameObject); } } } } namespace CustomScripts { public class Blockade : MonoBehaviour, IPurchasable { public Action OnPurchase; public List<Transform> UnlockableZombieSpawnPoints; public List<Transform> UnlockableSpecialZombieSpawnPoints; public List<Text> CostTexts; public int Cost; [SerializeField] private bool _isOneTimeOnly = true; private bool _alreadyBought; private bool _alreadyUsed; public int PurchaseCost => Cost; public bool IsOneTimeOnly => _isOneTimeOnly; public bool AlreadyBought => _alreadyBought; private void OnValidate() { foreach (Text costText in CostTexts) { costText.text = Cost.ToString(); } } public void Buy() { if (_alreadyUsed || !MonoBehaviourSingleton<GameManager>.Instance.TryRemovePoints(Cost)) { return; } _alreadyUsed = true; foreach (Transform unlockableZombieSpawnPoint in UnlockableZombieSpawnPoints) { if (!MonoBehaviourSingleton<ZombieManager>.Instance.CurrentLocation.ZombieSpawnPoints.Contains(unlockableZombieSpawnPoint)) { MonoBehaviourSingleton<ZombieManager>.Instance.CurrentLocation.ZombieSpawnPoints.Add(unlockableZombieSpawnPoint); } } foreach (Transform unlockableSpecialZombieSpawnPoint in UnlockableSpecialZombieSpawnPoints) { if (!MonoBehaviourSingleton<ZombieManager>.Instance.CurrentLocation.SpecialZombieSpawnPoints.Contains(unlockableSpecialZombieSpawnPoint)) { MonoBehaviourSingleton<ZombieManager>.Instance.CurrentLocation.SpecialZombieSpawnPoints.Add(unlockableSpecialZombieSpawnPoint); } } MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.BuySound, 0.5f); ((Component)this).gameObject.SetActive(false); if (OnPurchase != null) { OnPurchase(); } } } public class MysteryBox : MonoBehaviour, IPurchasable { public static Action<WeaponData> WeaponSpawnedEvent; public int Cost = 950; [SerializeField] private bool _isOneTimeOnly; private bool _alreadyBought; [HideInInspector] public List<WeaponData> LootId; [HideInInspector] public List<WeaponData> LimitedAmmoLootId; public ObjectSpawnPoint WeaponSpawner; public ObjectSpawnPoint AmmoSpawner; public AudioClip RollSound; [HideInInspector] public bool InUse = false; private MysteryBoxMover _mysteryBoxMover; public int PurchaseCost => Cost; public bool IsOneTimeOnly => _isOneTimeOnly; public bool AlreadyBought => _alreadyBought; private void Awake() { _mysteryBoxMover = ((Component)this).GetComponent<MysteryBoxMover>(); RoundManager.OnGameStarted = (Action)Delegate.Combine(RoundManager.OnGameStarted, new Action(LoadWeaponPool)); } private void LoadWeaponPool() { LootId = MonoBehaviourSingleton<GameSettings>.Instance.CurrentLootPool.MysteryBoxPool; LimitedAmmoLootId = MonoBehaviourSingleton<GameSettings>.Instance.CurrentLootPool.LimitedAmmoMysteryBoxPool; } public void SpawnWeapon() { if (!InUse && MonoBehaviourSingleton<GameManager>.Instance.TryRemovePoints(Cost)) { InUse = true; MonoBehaviourSingleton<AudioManager>.Instance.Play(RollSound, 0.25f); ((MonoBehaviour)this).StartCoroutine(DelayedSpawn()); } } private IEnumerator DelayedSpawn() { yield return (object)new WaitForSeconds(5.5f); if (_mysteryBoxMover.TryTeleport()) { _mysteryBoxMover.StartTeleportAnim(); MonoBehaviourSingleton<GameManager>.Instance.AddPoints(Cost); yield break; } if (GameSettings.LimitedAmmo) { int index = Random.Range(0, LimitedAmmoLootId.Count); WeaponData weaponData = LimitedAmmoLootId[index]; WeaponSpawner.ObjectId = weaponData.DefaultSpawners[0]; WeaponSpawner.Spawn(); AmmoSpawner.ObjectId = weaponData.DefaultSpawners[1]; for (int i = 0; i < weaponData.LimitedAmmoMagazineCount; i++) { AmmoSpawner.Spawn(); } if (WeaponSpawnedEvent != null) { WeaponSpawnedEvent(weaponData); } } else { int index2 = Random.Range(0, LootId.Count); WeaponData weaponData2 = LootId[index2]; WeaponSpawner.ObjectId = weaponData2.DefaultSpawners[0]; AmmoSpawner.ObjectId = weaponData2.DefaultSpawners[1]; WeaponSpawner.Spawn(); AmmoSpawner.Spawn(); if (WeaponSpawnedEvent != null) { WeaponSpawnedEvent(weaponData2); } } InUse = false; _mysteryBoxMover.CurrentRoll++; } private void OnDestroy() { RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(LoadWeaponPool)); } } public class MysteryBoxMover : MonoBehaviour { public List<Transform> SpawnPoints; [Range(0f, 100f)] public float TeleportChance = 20f; public int SafeRollsProvided = 3; public AudioClip TeddyBearSound; public AudioClip SecretTeddyBearSound; public Transform TeddyBear; [HideInInspector] public Transform CurrentPos; [HideInInspector] public int CurrentRoll = 0; private Animator _animator; private MysteryBox _mysteryBox; private Transform _parent; private void Awake() { _parent = ((Component)this).transform.parent; _animator = ((Component)_parent).GetComponent<Animator>(); _mysteryBox = ((Component)this).GetComponent<MysteryBox>(); } private void Start() { Teleport(firstTime: true); } public void Teleport(bool firstTime = false) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) Transform val = SpawnPoints[Random.Range(0, SpawnPoints.Count)]; if (!firstTime) { SpawnPoints.Add(CurrentPos); } CurrentPos = val; SpawnPoints.Remove(val); ((Component)_parent).transform.position = val.position; ((Component)_parent).transform.rotation = val.rotation; CurrentRoll = 0; _mysteryBox.InUse = false; } public bool TryTeleport() { if (CurrentRoll <= SafeRollsProvided) { return false; } return (float)Random.Range(0, 100) <= TeleportChance; } private void Update() { if (Input.GetKeyDown((KeyCode)104)) { StartTeleportAnim(); } } public void StartTeleportAnim() { GameObject gameObject; if (Random.Range(0, 5801) == 0) { gameObject = ((Component)TeddyBear.GetChild(1)).gameObject; MonoBehaviourSingleton<AudioManager>.Instance.Play(SecretTeddyBearSound); } else { gameObject = ((Component)TeddyBear.GetChild(0)).gameObject; MonoBehaviourSingleton<AudioManager>.Instance.Play(TeddyBearSound); } ((Component)TeddyBear).GetComponent<Animator>().Play("Activation"); gameObject.SetActive(true); ((MonoBehaviour)this).StartCoroutine(DelayedAnimation(gameObject)); } private IEnumerator DelayedAnimation(GameObject teddy) { yield return (object)new WaitForSeconds(3f); teddy.SetActive(false); yield return (object)new WaitForSeconds(1.2f); _animator.Play("Teleport"); ((MonoBehaviour)this).StartCoroutine(DelayedTeleport()); } private IEnumerator DelayedTeleport() { yield return (object)new WaitForSeconds(4.2f); Teleport(); } } public class QuestionMarkBlinking : MonoBehaviour { public Renderer QuestionMark1; public Renderer QuestionMark2; private float _emissionValue; private int _emissionWeight; private bool _emit; private float _time; private void Awake() { _emissionWeight = Shader.PropertyToID("_EmissionWeight"); } private void Update() { if (_emit) { if (_time >= 1.5f) { _emit = false; ((MonoBehaviour)this).StartCoroutine(SmoothEmissionChange(0f, 1f, 1f)); _time = 0f; } } else if (_time >= 3f) { _emit = true; ((MonoBehaviour)this).StartCoroutine(SmoothEmissionChange(1f, 0f, 1f)); _time = 0f; } _time += Time.deltaTime; } private IEnumerator SmoothEmissionChange(float startValue, float endValue, float duration) { float elapsed = 0f; while (elapsed < duration) { _emissionValue = Mathf.Lerp(startValue, endValue, elapsed / duration); elapsed += Time.deltaTime; QuestionMark1.sharedMaterial.SetFloat(_emissionWeight, _emissionValue); QuestionMark2.sharedMaterial.SetFloat(_emissionWeight, _emissionValue); yield return null; } _emissionValue = endValue; QuestionMark1.sharedMaterial.SetFloat(_emissionWeight, _emissionValue); QuestionMark2.sharedMaterial.SetFloat(_emissionWeight, _emissionValue); } } } namespace CustomScripts.Objects { public class Radio : MonoBehaviour, IFVRDamageable { public AudioClip Song; private bool _isThrottled; private bool _isPlaying; private Coroutine _musicEndCoroutine; private void Awake() { GameSettings.OnMusicSettingChanged = (Action)Delegate.Combine(GameSettings.OnMusicSettingChanged, new Action(OnMusicSettingsChanged)); } private void OnMusicSettingsChanged() { _isPlaying = false; if (_musicEndCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(_musicEndCoroutine); } } private void Update() { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown if (Input.GetKeyDown((KeyCode)99)) { Damage dam = new Damage(); Damage(dam); } if (Input.GetKeyDown((KeyCode)118)) { MonoBehaviourSingleton<GameSettings>.Instance.ToggleBackgroundMusic(); } } public void Damage(Damage dam) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 if ((int)dam.Class == 2 || _isThrottled) { return; } if (_isPlaying) { _isPlaying = false; MonoBehaviourSingleton<AudioManager>.Instance.MusicAudioSource.Stop(); if (GameSettings.BackgroundMusic) { MonoBehaviourSingleton<AudioManager>.Instance.PlayMusic(MonoBehaviourSingleton<AudioManager>.Instance.Music, 0.08f); } if (_musicEndCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(_musicEndCoroutine); } } else { _isPlaying = true; float length = Song.length; _musicEndCoroutine = ((MonoBehaviour)this).StartCoroutine(OnMusicEnd(length)); MonoBehaviourSingleton<AudioManager>.Instance.PlayMusic(Song, 0.095f); } ((MonoBehaviour)this).StartCoroutine(Throttle()); } private IEnumerator Throttle() { _isThrottled = true; yield return (object)new WaitForSeconds(0.5f); _isThrottled = false; } private IEnumerator OnMusicEnd(float endTimer) { yield return (object)new WaitForSeconds(endTimer); _isPlaying = false; if (GameSettings.BackgroundMusic) { MonoBehaviourSingleton<AudioManager>.Instance.PlayMusic(MonoBehaviourSingleton<AudioManager>.Instance.Music, 0.08f); } } private void OnDestroy() { GameSettings.OnMusicSettingChanged = (Action)Delegate.Remove(GameSettings.OnMusicSettingChanged, new Action(OnMusicSettingsChanged)); } } } namespace CustomScripts { public class StatPanel : MonoBehaviour { public Text RoundText; public Text PointsText; public Text LeftText; private void Start() { GameManager.OnPointsChanged = (Action)Delegate.Remove(GameManager.OnPointsChanged, new Action(UpdatePointsText)); GameManager.OnPointsChanged = (Action)Delegate.Combine(GameManager.OnPointsChanged, new Action(UpdatePointsText)); RoundManager.OnRoundChanged = (Action)Delegate.Remove(RoundManager.OnRoundChanged, new Action(UpdateRoundText)); RoundManager.OnRoundChanged = (Action)Delegate.Combine(RoundManager.OnRoundChanged, new Action(UpdateRoundText)); RoundManager.OnZombiesLeftChanged = (Action)Delegate.Remove(RoundManager.OnZombiesLeftChanged, new Action(UpdateLeftText)); RoundManager.OnZombiesLeftChanged = (Action)Delegate.Combine(RoundManager.OnZombiesLeftChanged, new Action(UpdateLeftText)); UpdateRoundText(); UpdatePointsText(); } private void OnDestroy() { GameManager.OnPointsChanged = (Action)Delegate.Remove(GameManager.OnPointsChanged, new Action(UpdatePointsText)); RoundManager.OnRoundChanged = (Action)Delegate.Remove(RoundManager.OnRoundChanged, new Action(UpdateRoundText)); RoundManager.OnZombiesLeftChanged = (Action)Delegate.Remove(RoundManager.OnZombiesLeftChanged, new Action(UpdateLeftText)); } private void UpdateRoundText() { RoundText.text = "Round:\n" + MonoBehaviourSingleton<RoundManager>.Instance.RoundNumber; } private void UpdatePointsText() { PointsText.text = "Points:\n" + MonoBehaviourSingleton<GameManager>.Instance.Points; } private void UpdateLeftText() { LeftText.text = "Left:\n" + MonoBehaviourSingleton<ZombieManager>.Instance.ZombiesRemaining; } } } namespace CustomScripts.Objects { public class WallShop : MonoBehaviour, IPurchasable { [Header("LootPool asset defines which weapon can be purchased")] public int ID; private const int AMMO_SPAWNER_ID = 1; public bool ExistsInLimitedAmmo = true; public bool ExistsInSpawnlock = true; [HideInInspector] public int Cost; [SerializeField] private bool _isOneTimeOnly; private bool _alreadyBought; public Text NameText; public Text CostText; public List<ObjectSpawnPoint> ItemSpawners; [HideInInspector] public WeaponData Weapon; public bool SameRebuy = false; [HideInInspector] public bool IsFree; public int PurchaseCost => Cost; public bool IsOneTimeOnly => _isOneTimeOnly; public bool AlreadyBought => _alreadyBought; private void Awake() { RoundManager.OnGameStarted = (Action)Delegate.Combine(RoundManager.OnGameStarted, new Action(OnRoundStarted)); } private void OnDestroy() { RoundManager.OnGameStarted = (Action)Delegate.Remove(RoundManager.OnGameStarted, new Action(OnRoundStarted)); } private void LoadWeapon() { if (ID >= MonoBehaviourSingleton<GameSettings>.Instance.CurrentLootPool.WallShopsPool.Count) { ((Component)this).gameObject.SetActive(false); return; } Weapon = MonoBehaviourSingleton<GameSettings>.Instance.CurrentLootPool.WallShopsPool[ID]; Cost = Weapon.Price; NameText.text = Weapon.DisplayName; CostText.text = Cost.ToString(); } private void OnRoundStarted() { if (GameSettings.LimitedAmmo && !ExistsInLimitedAmmo) { ((Component)this).gameObject.SetActive(false); } if (!GameSettings.LimitedAmmo && !ExistsInSpawnlock) { ((Component)this).gameObject.SetActive(false); } LoadWeapon(); } public void TryBuying() { if (!IsFree && !MonoBehaviourSingleton<GameManager>.Instance.TryRemovePoints(Cost)) { return; } IsFree = false; if (GameSettings.LimitedAmmo && !SameRebuy) { if (!_alreadyBought) { for (int i = 0; i < Weapon.DefaultSpawners.Count; i++) { if (i != 1) { ItemSpawners[i].ObjectId = Weapon.DefaultSpawners[i]; ItemSpawners[i].Spawn(); } } } if (SameRebuy) { for (int j = 0; j < Weapon.DefaultSpawners.Count; j++) { ItemSpawners[j].ObjectId = Weapon.DefaultSpawners[j]; ItemSpawners[j].Spawn(); } } else { ItemSpawners[1].ObjectId = Weapon.DefaultSpawners[1]; ((MonoBehaviour)this).StartCoroutine(DelayedAmmoSpawn()); } Cost = Weapon.AmmoBuyCost; CostText.text = Weapon.AmmoBuyCost.ToString(); } else { for (int k = 0; k < Weapon.DefaultSpawners.Count; k++) { ItemSpawners[k].ObjectId = Weapon.DefaultSpawners[k]; ItemSpawners[k].Spawn(); } } if (!_alreadyBought) { _alreadyBought = true; } MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.BuySound, 0.5f); } private IEnumerator DelayedAmmoSpawn() { for (int i = 0; i < Weapon.LimitedAmmoMagazineCount; i++) { ItemSpawners[1].Spawn(); yield return (object)new WaitForSeconds(0.15f); } } } } namespace CustomScripts.Objects.Weapons { [CreateAssetMenu(fileName = "WeaponData")] public class WeaponData : ScriptableObject { [Tooltip("Used by WallShop")] public string DisplayName; [Tooltip("No real use in the code btw")] public string Description; [Tooltip("First is always weapon, second is always ammo (if exists)")] public List<string> DefaultSpawners; [Tooltip("Result of pack a punching")] public WeaponData UpgradedWeapon; [Tooltip("How many magazines spawn in the limited ammo mode")] public int LimitedAmmoMagazineCount = 0; [Tooltip("How much does the weapon cost in the Wallshop")] public int Price; [Tooltip("How much does ammo cost in the limited ammo mode (Wall rebuy)")] public int AmmoBuyCost = 0; public string Id => DefaultSpawners[0]; } } namespace CustomScripts { public class DropPlankZone : MonoBehaviour { private void OnTriggerExit(Collider other) { Plank component = ((Component)other).GetComponent<Plank>(); if (Object.op_Implicit((Object)(object)component)) { ((FVRInteractiveObject)component.PhysicalObject).ForceBreakInteraction(); component.ReturnToRest(); } } } public class Plank : MonoBehaviour { [HideInInspector] public FVRPhysicalObject PhysicalObject; public Transform RestTransform; private void Awake() { PhysicalObject = ((Component)this).GetComponent<FVRPhysicalObject>(); } public void ReturnToRest() { ((MonoBehaviour)this).StartCoroutine(MoveTo(RestTransform, 0.5f)); } public void OnRepairDrop(Transform destination) { ((MonoBehaviour)this).StartCoroutine(MoveTo(destination, 0.2f)); MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.BarricadeRepairSound, 0.5f); } public IEnumerator MoveTo(Transform destination, float time) { Vector3 startingPos = ((Component)this).transform.position; Vector3 finalPos = destination.position; Quaternion startingRot = ((Component)this).transform.rotation; Quaternion finalRot = destination.rotation; float elapsedTime = 0f; while (elapsedTime < time) { ((Component)this).transform.position = Vector3.Lerp(startingPos, finalPos, elapsedTime / time); ((Component)this).transform.rotation = Quaternion.Lerp(startingRot, finalRot, elapsedTime / time); elapsedTime += Time.deltaTime; yield return null; } ((Component)this).transform.position = finalPos; ((Component)this).transform.rotation = finalRot; } } public class Window : MonoBehaviour { public static Action BarricadedEvent; public Transform ZombieWaypoint; public List<WindowPlank> PlankSlots; public List<Plank> AllPlanks; private AudioSource _tearPlankAudio; public int PlanksRemain { get; set; } public bool IsOpen => PlanksRemain == 0; private void Start() { _tearPlankAudio = ((Component)this).GetComponent<AudioSource>(); RepairAll(); } private void OnTriggerEnter(Collider other) { if (Object.op_Implicit((Object)(object)((Component)other).GetComponent<Plank>())) { OnPlankTouch(((Component)other).GetComponent<Plank>()); } } public void RepairAll(bool playSound = false) { //IL_0048: 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) for (int i = 0; i < PlankSlots.Count; i++) { PlankSlots[i].Plank = AllPlanks[i]; ((Component)AllPlanks[i]).transform.position = ((Component)PlankSlots[i]).transform.position; ((Component)AllPlanks[i]).transform.rotation = ((Component)PlankSlots[i]).transform.rotation; ((FVRInteractiveObject)AllPlanks[i].PhysicalObject).ForceBreakInteraction(); AllPlanks[i].PhysicalObject.IsPickUpLocked = true; } PlanksRemain = PlankSlots.Count; if (playSound) { MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.BarricadeRepairSound, 0.5f); } } public void OnPlankTouch(Plank plank) { if (BarricadedEvent != null && MonoBehaviourSingleton<GameManager>.Instance.GameStarted) { BarricadedEvent(); } if (MonoBehaviourSingleton<PlayerData>.Instance.SpeedColaPerkActivated) { RepairAll(playSound: true); return; } WindowPlank windowPlank = PlankSlots.FirstOrDefault((WindowPlank x) => (Object)(object)x.Plank == (Object)null); if (!Object.op_Implicit((Object)(object)windowPlank)) { RepairAll(); return; } windowPlank.Plank = plank; ((FVRInteractiveObject)plank.PhysicalObject).ForceBreakInteraction(); plank.PhysicalObject.IsPickUpLocked = true; plank.OnRepairDrop(((Component)windowPlank).transform); PlanksRemain++; } public void OnPlankRipped() { WindowPlank windowPlank = PlankSlots.LastOrDefault((WindowPlank x) => (Object)(object)x.Plank != (Object)null); if (Object.op_Implicit((Object)(object)windowPlank)) { Plank plank = windowPlank.Plank; plank.ReturnToRest(); FVRPhysicalObject component = ((Component)plank).GetComponent<FVRPhysicalObject>(); component.IsPickUpLocked = false; windowPlank.Plank = null; _tearPlankAudio.Play(); PlanksRemain--; } } } } namespace CustomScripts.Objects.Windows { public class WindowPlank : MonoBehaviour { public Plank Plank; } } namespace CustomScripts { public class WindowTrigger : MonoBehaviour { public Window Window; } } namespace GunGame.Scripts.Options { public class GameSettings : MonoBehaviourSingleton<GameSettings> { public static Action SettingsChanged; public static Action WeaponPoolChanged; public static bool DisabledAutoLoading; public static bool AlwaysChamberRounds; public static bool HealOnPromotion; [SerializeField] private Image DisabledAutoLoadingImage; [SerializeField] private Image AlwaysChamberRoundsImage; [SerializeField] private Image HealOnPromotionImage; [SerializeField] private Text MaxSosigCountText; public static int MaxSosigCount; public static WeaponPool CurrentPool { get; private set; } private void Start() { DisabledAutoLoading = false; AlwaysChamberRounds = false; HealOnPromotion = false; ResetMaxSosigCount(); } public void IncreaseMaxSosigCount() { MaxSosigCount++; MaxSosigCountText.text = MaxSosigCount.ToString(); if (SettingsChanged != null) { SettingsChanged(); } } public void DecreaseMaxSosigCount() { MaxSosigCount--; if (MaxSosigCount < 1) { MaxSosigCount = 1; } MaxSosigCountText.text = MaxSosigCount.ToString(); if (SettingsChanged != null) { SettingsChanged(); } } public void ResetMaxSosigCount() { MaxSosigCount = MonoBehaviourSingleton<SosigBehavior>.Instance.MaxSosigCount; MaxSosigCountText.text = MaxSosigCount.ToString(); if (SettingsChanged != null) { SettingsChanged(); } } public void ToggleAutoLoading() { DisabledAutoLoading = !DisabledAutoLoading; ((Behaviour)DisabledAutoLoadingImage).enabled = DisabledAutoLoading; if (SettingsChanged != null) { SettingsChanged(); } } public void ToggleAlwaysChamberRounds() { AlwaysChamberRounds = !AlwaysChamberRounds; ((Behaviour)AlwaysChamberRoundsImage).enabled = AlwaysChamberRounds; if (SettingsChanged != null) { SettingsChanged(); } } public void ToggleHealOnPromotion() { HealOnPromotion = !HealOnPromotion; ((Behaviour)HealOnPromotionImage).enabled = HealOnPromotion; if (SettingsChanged != null) { SettingsChanged(); } } public static void ChangeCurrentPool(WeaponPool newPool) { CurrentPool = newPool; CurrentPool.Initialize(); if (WeaponPoolChanged != null) { WeaponPoolChanged(); } if (SettingsChanged != null) { SettingsChanged(); } } } public class KillsPerWeaponOption : MonoBehaviour { public Action OptionChanged; public int DefaultCount; public static int KillsPerWeaponCount; [SerializeField] private Text _counterText; private void Awake() { OptionChanged = (Action)Delegate.Combine(OptionChanged, new Action(UpdateUI)); } private void Start() { ResetClicked(); } public void ArrowLeftClicked() { KillsPerWeaponCount--; if (KillsPerWeaponCount <= 1) { KillsPerWeaponCount = 1; } if (OptionChanged != null) { OptionChanged(); } } public void ArrowRightClicked() { KillsPerWeaponCount++; if (OptionChanged != null) { OptionChanged(); } } public void ResetClicked() { KillsPerWeaponCount = DefaultCount; if (OptionChanged != null) { OptionChanged(); } } private void UpdateUI() { _counterText.text = KillsPerWeaponCount.ToString(); } private void OnDestroy() { OptionChanged = (Action)Delegate.Remove(OptionChanged, new Action(UpdateUI)); } } public class LeftHandOption : MonoBehaviour { public Action OptionChanged; public static bool LeftHandModeEnabled; [SerializeField] private Image EnabledImage; private void Awake() { OptionChanged = (Action)Delegate.Combine(OptionChanged, new Action(UpdateUI)); LeftHandModeEnabled = false; ((Behaviour)EnabledImage).enabled = false; } public void ToggleClicked() { LeftHandModeEnabled = !LeftHandModeEnabled; if (OptionChanged != null) { OptionChanged(); } } private void UpdateUI() { ((Behaviour)EnabledImage).enabled = LeftHandModeEnabled; } private void OnDestroy() { OptionChanged = (Action)Delegate.Remove(OptionChanged, new Action(UpdateUI)); } } public class MusicToggleOption : MonoBehaviour { public Action OptionChanged; public static bool MusicEnabled; public AudioSource MusicAudioSource; public bool MusicEnabledAtStart = false; [SerializeField] private Image EnabledImage; private void Awake() { OptionChanged = (Action)Delegate.Combine(OptionChanged, new Action(OnToggleMusic)); MusicEnabled = MusicEnabledAtStart; ((Behaviour)EnabledImage).enabled = MusicEnabled; OnToggleMusic(); } public void ToggleClicked() { MusicEnabled = !MusicEnabled; if (OptionChanged != null) { OptionChanged(); } } private void OnToggleMusic() { if (MusicEnabled) { MusicAudioSource.Play(); } else { MusicAudioSource.Stop(); } ((Behaviour)EnabledImage).enabled = MusicEnabled; } private void OnDestroy() { OptionChanged = (Action)Delegate.Remove(OptionChanged, new Action(OnToggleMusic)); } } public class QuickbeltOption : MonoBehaviour { public static FVRQuickBeltSlot AmmoQuickbeltSlot; private FVRPhysicalObject MagObject; public Transform MagSpawnPos; private string _magName = "MagazineStanag5rnd"; private void Awake() { GameManager.BeforeGameStartedEvent = (Action)Delegate.Combine(GameManager.BeforeGameStartedEvent, new Action(OnGameStart)); } private IEnumerator Start() { yield return (object)new WaitForSeconds(0.2f); AmmoQuickbeltSlot = GM.CurrentPlayerBody.QBSlots_Internal[0]; SpawnMag(); } private void OnGameStart() { if (Object.op_Implicit((Object)(object)MagObject.QuickbeltSlot)) { AmmoQuickbeltSlot = MagObject.QuickbeltSlot; } } private void SpawnMag() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) FVRObject value = null; if (!IM.OD.TryGetValue(_magName, out value)) { Debug.LogError((object)("No object found with id: " + _magName)); return; } GameObject gameObject = ((AnvilAsset)value).GetGameObject(); GameObject val = Object.Instantiate<GameObject>(gameObject, ((Component)MagSpawnPos).transform.position, ((Component)this).transform.rotation); val.SetActive(true); MagObject = val.GetComponent<FVRPhysicalObject>(); } private void OnDestroy() { GameManager.BeforeGameStartedEvent = (Action)Delegate.Remove(GameManager.BeforeGameStartedEvent, new Action(OnGameStart)); } } public class SelectedPoolUI : MonoBehaviour { public Text TitleText; public Text DescriptionText; private void Awake() { GameSettings.SettingsChanged = (Action)Delegate.Combine(GameSettings.SettingsChanged, new Action(OnSettingsChanged)); } private void OnSettingsChanged() { TitleText.text = GameSettings.CurrentPool.Name; DescriptionText.text = GameSettings.CurrentPool.Description; } private void OnDestroy() { GameSettings.SettingsChanged = (Action)Delegate.Remove(GameSettings.SettingsChanged, new Action(OnSettingsChanged)); } } public class StartingHealthOption : MonoBehaviour { public Action OptionChanged; public int[] PossibleHealth; private int _optionIndex = 1; public static int CurrentHealth = 1000; [SerializeField] private Text _healthText; private void Awake() { PossibleHealth = new int[5] { 100, 1000, 2000, 5000, 10000 }; OptionChanged = (Action)Delegate.Combine(OptionChanged, new Action(UpdateUI)); OptionChanged = (Action)Delegate.Combine(OptionChanged, new Action(UpdateHealth)); } private IEnumerator Start() { yield return (object)new WaitForSeconds(0.1f); ResetClicked(); } public void ArrowLeftClicked() { _optionIndex--; if (_optionIndex < 0) { _optionIndex = 0; } CurrentHealth = PossibleHealth[_optionIndex]; if (OptionChanged != null) { OptionChanged(); } } public void ArrowRightClicked() { _optionIndex++; if (_optionIndex >= PossibleHealth.Length) { _optionIndex = PossibleHealth.Length - 1; } CurrentHealth = PossibleHealth[_optionIndex]; if (OptionChanged != null) { OptionChanged(); } } public void ResetClicked() { _optionIndex = 1; CurrentHealth = PossibleHealth[_optionIndex]; if (OptionChanged != null) { OptionChanged(); } } private void UpdateHealth() { GM.CurrentPlayerBody.SetHealthThreshold((float)CurrentHealth); GM.CurrentPlayerBody.ResetHealth(); } private void UpdateUI() { _healthText.text = CurrentHealth.ToString(); } private void OnDestroy() { OptionChanged = (Action)Delegate.Remove(OptionChanged, new Action(UpdateUI)); OptionChanged = (Action)Delegate.Remove(OptionChanged, new Action(UpdateHealth)); } } public class WeaponCountOption : MonoBehaviour { public Action OptionChanged; public static int WeaponCount; [SerializeField] private Text _counterText; private void Awake() { OptionChanged = (Action)Delegate.Combine(OptionChanged, new Action(UpdateUI)); GameSettings.WeaponPoolChanged = (Action)Delegate.Combine(GameSettings.WeaponPoolChanged, new Action(ResetClicked)); } public void ArrowLeftClicked() { WeaponCount--; if (WeaponCount <= 1) { WeaponCount = 1; } if (OptionChanged != null) { OptionChanged(); } } public void ArrowRightClicked() { WeaponCount++; if (WeaponCount > GameSettings.CurrentPool.Guns.Count) { WeaponCount = GameSettings.CurrentPool.Guns.Count; } if (OptionChanged != null) { OptionChanged(); } } public void ArrowRight10Clicked() { WeaponCount += 20; if (WeaponCount > GameSettings.CurrentPool.Guns.Count) { WeaponCount = GameSettings.CurrentPool.Guns.Count; } if (OptionChanged != null) { OptionChanged(); } } public void ArrowLeft10Clicked() { WeaponCount -= 20; if (WeaponCount <= 1) { WeaponCount = 1; } if (OptionChanged != null) { OptionChanged(); } } public void ResetClicked() { WeaponCount = GameSettings.CurrentPool.Guns.Count; if (OptionChanged != null) { OptionChanged(); } } private void UpdateUI() { _counterText.text = WeaponCount.ToString(); } private void OnDestroy() { OptionChanged = (Action)Delegate.Remove(OptionChanged, new Action(UpdateUI)); GameSettings.WeaponPoolChanged = (Action)Delegate.Remove(GameSettings.WeaponPoolChanged, new Action(ResetClicked)); } } } public class Pause : MonoBehaviour { [SerializeField] private Transform PauseWaypoint; [SerializeField] private Transform UnPauseWaypoint; [SerializeField] private Text TimeText; [SerializeField] private Text KillsText; [SerializeField] private Text DeathsText; private float _pauseTimer; public void PauseTheGame() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) GM.CurrentMovementManager.TeleportToPoint(PauseWaypoint.position, true, ((Component)this).transform.position + ((Component)this).transform.forward); KillsText.text = "Kills: " + GunGame.Scripts.MonoBehaviourSingleton<GunGame.Scripts.GameManager>.Instance.Kills; DeathsText.text = "Deaths: " + GunGame.Scripts.MonoBehaviourSingleton<GunGame.Scripts.GameManager>.Instance.Deaths; TimeSpan timeSpan = TimeSpan.FromSeconds(GunGame.Scripts.MonoBehaviourSingleton<GunGame.Scripts.GameManager>.Instance.GameTime); TimeText.text = "Time: " + timeSpan.Hours.ToString("00") + ":" + timeSpan.Minutes.ToString("00") + ":" + timeSpan.Seconds.ToString("00"); _pauseTimer = Time.time; } public void UnpauseTheGame() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) GM.CurrentMovementManager.TeleportToPoint(UnPauseWaypoint.position, true, ((Component)this).transform.position + ((Component)this).transform.forward); float timePaused = Time.time - _pauseTimer; GunGame.Scripts.MonoBehaviourSingleton<GunGame.Scripts.GameManager>.Instance.RemovePausedTime(timePaused); } } namespace CustomScripts { public class DeadShotPerkBottle : MonoBehaviour, IModifier { public void ApplyModifier() { MonoBehaviourSingleton<PlayerData>.Instance.DeadShotPerkActivated = true; if (!GameSettings.UseCustomEnemies) { for (int i = 0; i < MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies.Count; i++) { (MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies[i] as ZosigZombieController).CheckPerks(); } } else { for (int j = 0; j < MonoBehaviourSingleton<ZombieManager>.Instance.AllCustomZombies.Count; j++) { CapsuleCollider component = (MonoBehaviourSingleton<ZombieManager>.Instance.AllCustomZombies[j] as CustomZombieController).HeadObject.GetComponent<CapsuleCollider>(); component.radius *= 1.375f; } } MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.DrinkSound); Object.Destroy((Object)(object)((Component)this).gameObject); } } public class DoubleTapPerkBottle : MonoBehaviour, IModifier { public float DamageMultiplier = 1.5f; public void ApplyModifier() { MonoBehaviourSingleton<PlayerData>.Instance.DoubleTapPerkActivated = true; if (!GameSettings.UseCustomEnemies) { for (int i = 0; i < MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies.Count; i++) { (MonoBehaviourSingleton<ZombieManager>.Instance.ExistingZombies[i] as ZosigZombieController).CheckPerks(); } } FVRInteractiveObject currentInteractable = MonoBehaviourSingleton<PlayerData>.Instance.LeftHand.CurrentInteractable; FVRFireArm val = (FVRFireArm)(object)((currentInteractable is FVRFireArm) ? currentInteractable : null); if ((Object)(object)val != (Object)null) { ((Component)val).GetComponent<WeaponWrapper>().OnWeaponGrabbed(); } FVRInteractiveObject currentInteractable2 = MonoBehaviourSingleton<PlayerData>.Instance.RightHand.CurrentInteractable; val = (FVRFireArm)(object)((currentInteractable2 is FVRFireArm) ? currentInteractable2 : null); if ((Object)(object)val != (Object)null) { ((Component)val).GetComponent<WeaponWrapper>().OnWeaponGrabbed(); } MonoBehaviourSingleton<PlayerData>.Instance.DamageModifier *= DamageMultiplier; MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.DrinkSound); Object.Destroy((Object)(object)((Component)this).gameObject); } } } public class ElectricCherryPerkBottle : MonoBehaviour, IModifier { public void ApplyModifier() { CustomScripts.MonoBehaviourSingleton<PlayerData>.Instance.ElectricCherryPerkActivated = true; CustomScripts.MonoBehaviourSingleton<AudioManager>.Instance.Play(CustomScripts.MonoBehaviourSingleton<AudioManager>.Instance.DrinkSound); Object.Destroy((Object)(object)((Component)this).gameObject); } } namespace CustomScripts { public class JuggerNogPerkBottle : MonoBehaviour, IModifier { public static Action ConsumedEvent; public float NewHealth = 10000f; public void ApplyModifier() { GM.CurrentPlayerBody.SetHealthThreshold(NewHealth); GM.CurrentPlayerBody.ResetHealth(); if (ConsumedEvent != null) { ConsumedEvent(); } MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.DrinkSound); Object.Destroy((Object)(object)((Component)this).gameObject); } } } namespace CustomScripts.Powerups.Perks { public class MuleKickPerkBottle : MonoBehaviour, IModifier { public ObjectSpawnPoint Spawner; public string ObjectID; public GameObject Model; public void ApplyModifier() { Spawner.ObjectId = ObjectID; Spawner.Spawn(); ((Component)this).GetComponent<FVRPhysicalObject>().IsPickUpLocked = true; ((FVRInteractiveObject)((Component)this).GetComponent<FVRPhysicalObject>()).ForceBreakInteraction(); ((Component)this).GetComponent<Collider>().enabled = false; Model.SetActive(false); MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.DrinkSound); Object.Destroy((Object)(object)((Component)this).gameObject, 1f); } } public class PHDFlopperPerkBottle : MonoBehaviour, IModifier { public void ApplyModifier() { MonoBehaviourSingleton<PlayerData>.Instance.PHDFlopperPerkActivated = true; MonoBehaviourSingleton<AudioManager>.Instance.Play(MonoBehaviourSingleton<AudioManager>.Instance.DrinkSound); Object.Destroy((Object