using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using BoysClubMegaPack.Patches;
using BoysClubMegaPack.Suits;
using BoysClubMegaPack.Util;
using CSync.Lib;
using GameNetcodeStuff;
using HarmonyLib;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalLevelLoader;
using LethalNetworkAPI;
using ModelReplacement;
using Unity.Netcode;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("BoysClubMegaPack")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("BoysClubMegaPack")]
[assembly: AssemblyTitle("BoysClubMegaPack")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace BoysClubMegaPack
{
public class Config : SyncedConfig2<Config>
{
public readonly List<ConfigEntry<int>> scrapEntries = new List<ConfigEntry<int>>();
public readonly ConfigEntry<bool> infStamCompany;
public readonly ConfigEntry<string> headCanonList;
public Config(ConfigFile cfg, List<ExtendedItem> scraps)
: base("boysclub.boysclubmod")
{
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Expected O, but got Unknown
//IL_00a3: Expected O, but got Unknown
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Expected O, but got Unknown
//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Expected O, but got Unknown
//IL_0114: Expected O, but got Unknown
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: Expected O, but got Unknown
//IL_0136: 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_0155: Expected O, but got Unknown
//IL_0155: Expected O, but got Unknown
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_016a: Expected O, but got Unknown
cfg.SaveOnConfigSet = false;
int num = 0;
foreach (ExtendedItem scrap in scraps)
{
string itemName = scrap.Item.itemName;
scrapEntries.Add(cfg.Bind<int>(new ConfigDefinition("Scrap Spawn Rate", Regex.Replace(itemName, "[^0-9a-zA-Z: .]+", "").Trim()), scrap.LevelMatchingProperties.levelTags[0].Rarity, new ConfigDescription("The weighted rarity of the " + itemName + " scrap!", (AcceptableValueBase)null, Array.Empty<object>())));
LethalConfigManager.AddConfigItem((BaseConfigItem)new IntInputFieldConfigItem(scrapEntries[num]));
num++;
}
LethalConfigManager.SkipAutoGenFor("Scrap Spawn Rate");
infStamCompany = cfg.Bind<bool>(new ConfigDefinition("Extra", "Infinite Stamina at Company"), false, new ConfigDescription("Whether to enable infinite stamina at the Company Building or not", (AcceptableValueBase)null, Array.Empty<object>()));
LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(infStamCompany));
headCanonList = cfg.Bind<string>(new ConfigDefinition("Extra", "Headcanon Kewtians List"), "All", new ConfigDescription("Which characters should be treated as kewtians (No giant pictures, no planets on statues)\nAcceptable values: (Amy, Villager, Toad, Toadette, Fyre, Toon Link, None, All)", (AcceptableValueBase)null, Array.Empty<object>()));
LethalConfigManager.AddConfigItem((BaseConfigItem)new TextInputFieldConfigItem(headCanonList));
List<string> list = headCanonList.Value.Split(",").ToList();
for (int i = 0; i < list.Count; i++)
{
if (Regex.IsMatch(list[i].ToLower(), "(?:\\b|')(amy|toad|toadette|villager|fyre|toon link)(?:\\b|')"))
{
Plugin.allowedHeadcanons.Add(list[i].ToLower());
}
if (Regex.IsMatch(list[i].ToLower(), "(?:\\b|')(none|all)(?:\\b|')"))
{
Plugin.allowedHeadcanons.Clear();
Plugin.allowedHeadcanons.Add(list[i].ToLower());
}
}
ClearUnusedEntries(cfg);
cfg.Save();
cfg.SaveOnConfigSet = true;
ConfigManager.Register<Config>((SyncedConfig2<Config>)this);
}
private void ClearUnusedEntries(ConfigFile configFile)
{
PropertyInfo property = ((object)configFile).GetType().GetProperty("OrphanedEntries", BindingFlags.Instance | BindingFlags.NonPublic);
Dictionary<ConfigDefinition, string> dictionary = (Dictionary<ConfigDefinition, string>)property.GetValue(configFile, null);
dictionary.Clear();
configFile.Save();
}
}
public class CustomNoisemaker : PhysicsProp
{
public AudioSource noiseAudio;
public AudioSource noiseAudioFar;
[Space(3f)]
public AudioClip[] noiseSFX;
public AudioClip[] noiseSFXFar;
[Space(3f)]
public float noiseRange;
public float maxLoudness;
public float minLoudness;
public float minPitch;
public float maxPitch;
private Random noisemakerRandom;
public Animator triggerAnimator;
private bool wasJustHeld;
private float sfxCooldown;
public override void Start()
{
((GrabbableObject)this).Start();
noisemakerRandom = new Random((int)((Component)this).gameObject.GetComponent<NetworkObject>().NetworkObjectId);
}
public override void Update()
{
((GrabbableObject)this).Update();
if (!noiseAudio.isPlaying && (Object)(object)noiseAudio.clip != (Object)null)
{
noiseAudio.clip = null;
}
if (!noiseAudioFar.isPlaying && (Object)(object)noiseAudioFar.clip != (Object)null)
{
noiseAudioFar.clip = null;
}
if (sfxCooldown > 0f)
{
sfxCooldown -= Time.deltaTime;
}
if (sfxCooldown < 0f)
{
sfxCooldown = 0f;
}
if (((Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null && (Object)(object)((GrabbableObject)this).playerHeldBy.currentlyHeldObjectServer != (Object)(object)this) || (Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null)
{
wasJustHeld = false;
}
if (!((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null) && (Object)(object)((GrabbableObject)this).playerHeldBy.currentlyHeldObjectServer == (Object)(object)this && !wasJustHeld)
{
if ((Object)(object)((GrabbableObject)this).itemProperties.grabSFX != (Object)null)
{
noiseAudio.Stop();
noiseAudio.clip = ((GrabbableObject)this).itemProperties.grabSFX;
noiseAudio.volume = 1f;
noiseAudio.Play();
WalkieTalkie.TransmitOneShotAudio(noiseAudio, ((GrabbableObject)this).itemProperties.grabSFX, 1f);
sfxCooldown = 0.05f;
}
wasJustHeld = true;
}
}
public override void GrabItem()
{
((GrabbableObject)this).GrabItem();
if (!((Object)(object)((GrabbableObject)this).playerHeldBy == (Object)null))
{
((GrabbableObject)this).playerHeldBy.itemAudio.Stop();
}
}
public override void PocketItem()
{
if (((NetworkBehaviour)this).IsOwner && (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null)
{
((GrabbableObject)this).playerHeldBy.IsInspectingItem = false;
}
((GrabbableObject)this).isPocketed = true;
((GrabbableObject)this).EnableItemMeshes(false);
if ((Object)(object)((GrabbableObject)this).itemProperties.pocketSFX != (Object)null && sfxCooldown <= 0f)
{
noiseAudio.clip = ((GrabbableObject)this).itemProperties.pocketSFX;
noiseAudio.volume = 1f;
noiseAudio.Play();
WalkieTalkie.TransmitOneShotAudio(noiseAudio, ((GrabbableObject)this).itemProperties.pocketSFX, 1f);
}
}
public override void PlayDropSFX()
{
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)((GrabbableObject)this).itemProperties.dropSFX != (Object)null)
{
noiseAudio.clip = ((GrabbableObject)this).itemProperties.dropSFX;
noiseAudio.Play();
WalkieTalkie.TransmitOneShotAudio(noiseAudio, ((GrabbableObject)this).itemProperties.dropSFX, 1f);
if (((NetworkBehaviour)this).IsOwner)
{
RoundManager.Instance.PlayAudibleNoise(((Component)this).transform.position, 8f, 0.5f, 0, ((GrabbableObject)this).isInElevator && StartOfRound.Instance.hangarDoorsClosed, 941);
}
}
((GrabbableObject)this).hasHitGround = true;
}
public override void ItemActivate(bool used, bool buttonDown = true)
{
//IL_0161: Unknown result type (might be due to invalid IL or missing references)
((GrabbableObject)this).ItemActivate(used, buttonDown);
if (!((Object)(object)GameNetworkManager.Instance.localPlayerController == (Object)null))
{
int num = noisemakerRandom.Next(0, noiseSFX.Length);
float num2 = (float)noisemakerRandom.Next((int)(minLoudness * 100f), (int)(maxLoudness * 100f)) / 100f;
float pitch = (float)noisemakerRandom.Next((int)(minPitch * 100f), (int)(maxPitch * 100f)) / 100f;
noiseAudio.pitch = pitch;
noiseAudio.clip = noiseSFX[num];
noiseAudio.volume = num2;
noiseAudio.Play();
if ((Object)(object)noiseAudioFar != (Object)null)
{
noiseAudioFar.pitch = pitch;
noiseAudioFar.clip = noiseSFXFar[num];
noiseAudioFar.volume = num2;
noiseAudioFar.Play();
}
if ((Object)(object)triggerAnimator != (Object)null)
{
triggerAnimator.SetTrigger("playAnim");
}
WalkieTalkie.TransmitOneShotAudio(noiseAudio, noiseSFX[num], num2);
RoundManager.Instance.PlayAudibleNoise(((Component)this).transform.position, noiseRange, num2, 0, ((GrabbableObject)this).isInElevator && StartOfRound.Instance.hangarDoorsClosed, 0);
if (minLoudness >= 0.6f && (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null)
{
((GrabbableObject)this).playerHeldBy.timeSinceMakingLoudNoise = 0f;
}
}
}
}
public class MaterialVariants : NetworkBehaviour
{
[HideInInspector]
public Item itemData;
[Tooltip("The mesh renderers to change the material of. This will use the first material in the array.")]
public MeshRenderer[] meshRenderers;
[Space(5f)]
public bool ChangeScanNodeText;
[Tooltip("The text to change to when the material is changed.")]
public string[] scanNodeText;
[Space(5f)]
[Tooltip("The scan node properties to change the text of.")]
public ScanNodeProperties scanNodeProperties;
[HideInInspector]
public int matID;
public void Start()
{
itemData = ((Component)this).gameObject.GetComponent<GrabbableObject>().itemProperties;
SetRenderer_ServerRpc();
}
[ServerRpc]
public void SetRenderer_ServerRpc()
{
Random.InitState((int)((Component)this).gameObject.GetComponent<NetworkObject>().NetworkObjectId);
matID = Random.Range(0, itemData.materialVariants.Length);
SetRenderer_ClientRpc(matID);
}
[ClientRpc]
private void SetRenderer_ClientRpc(int matid)
{
if (!((Object)(object)((Component)this).gameObject.GetComponent<GrabbableObject>() != (Object)null))
{
return;
}
MeshRenderer[] array = meshRenderers;
foreach (MeshRenderer val in array)
{
if (((Renderer)val).rendererPriority != 70 && ((Component)val).gameObject.layer != LayerMask.NameToLayer("UI"))
{
Material[] materials = ((Renderer)val).materials;
for (int j = 0; j < materials.Length; j++)
{
materials[j] = itemData.materialVariants[matid];
}
((Renderer)val).materials = materials;
}
}
if (ChangeScanNodeText)
{
scanNodeProperties.headerText = scanNodeText[matid];
}
}
}
[CreateAssetMenu(fileName = "PaintingManifest", menuName = "BoysClubMod/PaintingManifest")]
public class PaintingManifest : ScriptableObject
{
[Tooltip("The mesh to use")]
public Mesh paintingMesh;
[Tooltip("What Pictures will use this mesh")]
public List<Texture2D> paintingTextures;
}
public class PictureVariants : NetworkBehaviour
{
[Tooltip("The Manifest which houses all pictures and the mesh")]
public static PaintingManifest paintingType;
[Space(5f)]
[Tooltip("What will be changed via painting type")]
public MeshFilter[] paintingMeshes;
[Space(5f)]
[Tooltip("The mesh renderers to change the material of. This will use the first material in the array.")]
public MeshRenderer[] meshRenderers;
[HideInInspector]
public Texture2D pictureID;
public void Start()
{
SetRenderer_ServerRpc();
}
[ServerRpc]
public void SetRenderer_ServerRpc()
{
Random.InitState((int)((Component)this).gameObject.GetComponent<NetworkObject>().NetworkObjectId);
pictureID = Pictures.PictureTextures[Random.Range(0, Pictures.PictureTextures.Count)];
for (int i = 0; i < Pictures.PaintingManifests.Length; i++)
{
if (Pictures.PaintingManifests[i].paintingTextures.Contains(pictureID))
{
paintingType = Pictures.PaintingManifests[i];
}
}
SetRenderer_ClientRpc(pictureID);
}
[ClientRpc]
private void SetRenderer_ClientRpc(Texture2D tex)
{
if (!((Object)(object)((Component)this).gameObject.GetComponent<GrabbableObject>() != (Object)null))
{
return;
}
MeshRenderer[] array = meshRenderers;
foreach (MeshRenderer val in array)
{
if (((Renderer)val).rendererPriority != 70 && ((Component)val).gameObject.layer != LayerMask.NameToLayer("UI"))
{
for (int j = 0; j < ((Renderer)val).materials.Length; j++)
{
((Renderer)val).materials[j].mainTexture = (Texture)(object)tex;
}
}
}
for (int k = 0; k < paintingMeshes.Length; k++)
{
paintingMeshes[k].mesh = paintingType.paintingMesh;
}
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency("com.sigurd.csync", "5.0.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("boysclub.boysclubmod", "BoysClubMegaPack", "1.11.4")]
public class Plugin : BaseUnityPlugin
{
public const string GUID = "boysclub.boysclubmod";
public const string NAME = "BoysClubMegaPack";
public const string VERSION = "1.11.4";
public static Plugin instance;
internal static List<string> allowedHeadcanons = new List<string>();
internal static ManualLogSource Logger { get; private set; } = null;
internal static Config Config { get; private set; } = null;
internal static Harmony Harmony { get; private set; } = new Harmony("boysclub.boysclubmod");
private void Awake()
{
instance = this;
Logger = ((BaseUnityPlugin)this).Logger;
Assets.PopulateAssets();
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
Type[] array = types;
foreach (Type type in array)
{
MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo[] array2 = methods;
foreach (MethodInfo methodInfo in array2)
{
object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
if (customAttributes.Length != 0)
{
methodInfo.Invoke(null, null);
}
}
}
BoysClubMegaPack.Suits.Suits.InitSuits();
Logger.LogInfo((object)"BoysClubMegaPack Suits Patched!");
AssetBundleLoader.AddOnExtendedModLoadedListener((Action<ExtendedMod>)OnExtendedModRegistered, (string)null, "BoysClubMegaPack");
BoysClubMegaPack.Patches.Patches.PatchAll();
}
private void OnExtendedModRegistered(ExtendedMod extendedMod)
{
if ((Object)(object)extendedMod == (Object)null)
{
return;
}
Config = new Config(((BaseUnityPlugin)this).Config, extendedMod.ExtendedItems);
for (int i = 0; i < extendedMod.ExtendedItems.Count; i++)
{
if (extendedMod.ExtendedItems[i].LevelMatchingProperties.levelTags != null && extendedMod.ExtendedItems[i].LevelMatchingProperties.levelTags.Count > 0)
{
for (int j = 0; j < extendedMod.ExtendedItems[i].LevelMatchingProperties.levelTags.Count; j++)
{
extendedMod.ExtendedItems[i].LevelMatchingProperties.levelTags[j].Rarity = Config.scrapEntries[i].Value;
}
}
}
Pictures.RegisterPictures();
Logger.LogInfo((object)"BoysClubMegaPack Pictures Patched!");
Logger.LogInfo((object)"BoysClubMegaPack Scrap Patched!");
}
}
public static class Assets
{
public static AssetBundle SuitsAssetBundle;
public static AssetBundle PictureAssetBundle;
public static void PopulateAssets()
{
if ((Object)(object)SuitsAssetBundle == (Object)null)
{
string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "/BoysClub", "boysclubmegapacksuits");
SuitsAssetBundle = AssetBundle.LoadFromFile(text);
}
if ((Object)(object)PictureAssetBundle == (Object)null)
{
string text2 = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "/BoysClub", "boysclubpictures");
PictureAssetBundle = AssetBundle.LoadFromFile(text2);
}
}
}
public static class PluginInfo
{
public const string PLUGIN_GUID = "BoysClubMegaPack";
public const string PLUGIN_NAME = "BoysClubMegaPack";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace BoysClubMegaPack.Suits
{
public class Suits
{
public static void InitSuits()
{
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
ModelReplacementAPI.RegisterSuitModelReplacement("Amy Rose", typeof(MRAMYROSESUITMODEL));
ModelReplacementAPI.RegisterSuitModelReplacement("Toon Link", typeof(MRTOONLINKSUIT));
Harmony val = new Harmony("com.boysclub.megapacksuits");
val.PatchAll();
}
}
public class MRAMYROSESUITMODEL : BodyReplacementBase
{
protected override GameObject LoadAssetsAndReturnModel()
{
return Assets.SuitsAssetBundle.LoadAsset<GameObject>("AmyRoseSuitModel");
}
}
public class MRTOONLINKSUIT : BodyReplacementBase
{
protected override GameObject LoadAssetsAndReturnModel()
{
return Assets.SuitsAssetBundle.LoadAsset<GameObject>("ToonLinkSuit");
}
}
}
namespace BoysClubMegaPack.Util
{
public class Pictures
{
public static PaintingManifest[] PaintingManifests;
public static List<Texture2D> PictureTextures = new List<Texture2D>();
public static void RegisterPictures()
{
PaintingManifests = Assets.PictureAssetBundle.LoadAllAssets<PaintingManifest>();
PaintingManifest[] paintingManifests = PaintingManifests;
foreach (PaintingManifest paintingManifest in paintingManifests)
{
foreach (Texture2D paintingTexture in paintingManifest.paintingTextures)
{
if ((!Plugin.allowedHeadcanons.Contains("none".TrimStart()) || !Regex.IsMatch(((Object)paintingTexture).name, "\\W*(_AMY|_TOADETTE|_TOAD|_VILLAGER|_FYRE|_TL)\\W*")) && (Plugin.allowedHeadcanons.Contains("all".TrimStart()) || ((Plugin.allowedHeadcanons.Contains("amy".TrimStart()) || !Regex.IsMatch(((Object)paintingTexture).name, "_AMY")) && (Plugin.allowedHeadcanons.Contains("villager".TrimStart()) || !Regex.IsMatch(((Object)paintingTexture).name, "_VILLAGER")) && (Plugin.allowedHeadcanons.Contains("toon link".TrimStart()) || !Regex.IsMatch(((Object)paintingTexture).name, "_TL")) && (Plugin.allowedHeadcanons.Contains("toadette".TrimStart()) || !Regex.IsMatch(((Object)paintingTexture).name, "_TOADETTE")) && (Plugin.allowedHeadcanons.Contains("toad".TrimStart()) || !Regex.IsMatch(((Object)paintingTexture).name, "_TOAD") || Regex.IsMatch(((Object)paintingTexture).name, "_TOADETTE")) && (Plugin.allowedHeadcanons.Contains("fyre".TrimStart()) || !Regex.IsMatch(((Object)paintingTexture).name, "_FYRE")))))
{
PictureTextures.Add(paintingTexture);
}
}
}
}
}
internal class UtilEffects
{
public static IEnumerator Explosion(int range, float waitTime = 0f, GrabbableObject obj = null, Vector3 position = default(Vector3), bool destroy = false)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
yield return (object)new WaitForSeconds(waitTime);
Landmine.SpawnExplosion(((Object)(object)obj != (Object)null) ? ((Component)obj).transform.position : position, true, (float)range, (float)(range * 2), 50, 1f, (GameObject)null, false);
if (destroy && (Object)(object)obj != (Object)null)
{
DestroyObjectServerRpc(NetworkObjectReference.op_Implicit(((Component)obj).GetComponent<NetworkObject>()));
}
}
[ServerRpc(RequireOwnership = false)]
public static void DestroyObjectServerRpc(NetworkObjectReference obj)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
DestroyObjectClientRpc(obj);
}
[ClientRpc]
private static void DestroyObjectClientRpc(NetworkObjectReference obj)
{
NetworkObject val = default(NetworkObject);
if (((NetworkObjectReference)(ref obj)).TryGet(ref val, (NetworkManager)null))
{
DestroyObject(((Component)val).gameObject.GetComponentInChildren<GrabbableObject>());
}
}
private static void DestroyObject(GrabbableObject grabbableObject)
{
if ((Object)(object)grabbableObject != (Object)null)
{
FlashlightItem val = (FlashlightItem)(object)((grabbableObject is FlashlightItem) ? grabbableObject : null);
if (val != null && ((GrabbableObject)val).isBeingUsed)
{
((GrabbableObject)val).isBeingUsed = false;
val.usingPlayerHelmetLight = false;
((Behaviour)val.flashlightBulbGlow).enabled = false;
val.SwitchFlashlight(false);
}
grabbableObject.DestroyObjectInHand(grabbableObject.playerHeldBy);
((Component)grabbableObject).GetComponentInParent<NetworkObject>().Despawn(true);
}
}
public static void Damage(PlayerControllerB player, int damageNb, int animation = 0, bool criticalBlood = true, bool hasSfx = true)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
if (criticalBlood && player.health - damageNb <= 20)
{
player.bleedingHeavily = true;
}
player.DamagePlayer(damageNb, hasSfx, true, (CauseOfDeath)0, animation, false, default(Vector3));
}
[ServerRpc(RequireOwnership = false)]
public static void HealPlayerServerRpc(ulong playerID, int health)
{
HealPlayerClientRpc(playerID, health);
}
[ClientRpc]
private static void HealPlayerClientRpc(ulong playerID, int health)
{
Heal(playerID, health);
}
public static void Heal(ulong playerID, int health)
{
PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[playerID];
val.health = health;
val.criticallyInjured = false;
val.bleedingHeavily = false;
val.playerBodyAnimator.SetBool("Limp", false);
HUDManager.Instance.UpdateHealthUI(health, false);
}
public static void Message(string title, string bottom, bool warning = false)
{
HUDManager.Instance.DisplayTip(title, bottom, warning, false, "LC_Tip1");
}
public static void Spawn(string scrapName, Vector3 position)
{
//IL_0035: 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_006b: 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)
Item val = ((IEnumerable<Item>)StartOfRound.Instance.allItemsList.itemsList).FirstOrDefault((Func<Item, bool>)((Item i) => ((Object)i).name.Equals(scrapName)));
GameObject val2 = Object.Instantiate<GameObject>(val.spawnPrefab, position, Quaternion.identity, RoundManager.Instance.spawnedScrapContainer);
val2.GetComponent<NetworkObject>().Spawn(false);
GrabbableObject component = val2.GetComponent<GrabbableObject>();
((Component)component).transform.rotation = Quaternion.Euler(component.itemProperties.restingRotation);
component.fallTime = 0f;
component.FallToGround(true);
Random.InitState((int)val2.GetComponent<NetworkObject>().NetworkObjectId);
component.SetScrapValue((int)((float)Random.Range(val.minValue, val.maxValue) * RoundManager.Instance.scrapValueMultiplier));
}
}
}
namespace BoysClubMegaPack.Patches
{
[HarmonyPatch(typeof(PlayerControllerB))]
internal class PlayerControllerBPatch
{
[HarmonyPatch("Update")]
[HarmonyPostfix]
private static void infiniteSprintPatch(ref float ___sprintMeter)
{
if (Plugin.Config.infStamCompany.Value && ((Object)StartOfRound.Instance.currentLevel).name == "CompanyBuildingLevel" && !StartOfRound.Instance.inShipPhase)
{
___sprintMeter = 1f;
}
}
}
internal class Patches
{
public static void PatchAll()
{
Plugin.Harmony.PatchAll(typeof(Plugin));
Plugin.Harmony.PatchAll();
}
}
}
namespace BoysClubMegaPack.Effects
{
public class BoysClubEffects : MonoBehaviour
{
private GrabbableObject go;
private PlayerControllerB previousPlayerHeldBy;
private ScanNodeProperties scanNode;
public bool healOverTime;
[SerializeField]
private float healSpeed = 1f;
private float healTimer = 0f;
public bool spinOverTime;
[SerializeField]
private float spinSpeed = 1f;
[SerializeField]
private Transform spinObj;
public bool boggle;
public bool rotateOnInspect;
[SerializeField]
private Vector3 inspectRotation;
public bool randomScanNumber;
[SerializeField]
private string rsnScanName;
[SerializeField]
private Vector2 rsnMinMax;
private void Awake()
{
go = ((Component)this).GetComponent<GrabbableObject>();
scanNode = ((Component)this).GetComponentInChildren<ScanNodeProperties>();
}
private void Start()
{
if (randomScanNumber)
{
RandomScanNumber();
}
}
private void Update()
{
if (healOverTime)
{
HealOverTime();
}
if (spinOverTime)
{
SpinOverTime();
}
if (boggle)
{
Boggle();
}
}
private void LateUpdate()
{
if (rotateOnInspect)
{
RotateOnInspect();
}
}
protected void HealOverTime()
{
if (!go.isHeld || go.isHeldByEnemy || (Object)(object)go.playerHeldBy == (Object)null || (Object)(object)go.playerHeldBy.currentlyHeldObjectServer != (Object)(object)go || go.playerHeldBy.health >= 100)
{
healTimer = 0f;
return;
}
healTimer += healSpeed * Time.deltaTime;
if (!(healTimer < 1f))
{
UtilEffects.HealPlayerServerRpc(StartOfRound.Instance.localPlayerController.playerClientId, go.playerHeldBy.health + (int)healTimer);
healTimer %= 1f;
}
}
protected void SpinOverTime()
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)spinObj == (Object)null))
{
spinObj.Rotate(Vector3.up * spinSpeed * Time.deltaTime);
}
}
protected void Boggle()
{
if ((Object)(object)go.playerHeldBy != (Object)null)
{
int num = 0;
for (int i = 0; i < go.playerHeldBy.ItemSlots.Length; i++)
{
if (!((Object)(object)go.playerHeldBy.ItemSlots[i] == (Object)null) && !((Object)(object)((Component)go.playerHeldBy.ItemSlots[i]).GetComponent<BoysClubEffects>() == (Object)null) && ((Component)go.playerHeldBy.ItemSlots[i]).GetComponent<BoysClubEffects>().boggle)
{
num++;
}
}
if ((Object)(object)previousPlayerHeldBy != (Object)(object)go.playerHeldBy)
{
previousPlayerHeldBy = go.playerHeldBy;
}
go.playerHeldBy.drunkness = Mathf.Clamp((float)num / 6.1538463f, 0f, 1f);
}
else if ((Object)(object)previousPlayerHeldBy != (Object)null)
{
previousPlayerHeldBy.drunkness = 0f;
previousPlayerHeldBy = null;
}
}
protected void RotateOnInspect()
{
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)go.playerHeldBy == (Object)null) && go.playerHeldBy.IsInspectingItem && (Object)(object)go.playerHeldBy.currentlyHeldObjectServer == (Object)(object)go && (Object)(object)go.playerHeldBy == (Object)(object)GameNetworkManager.Instance.localPlayerController)
{
((Component)go).transform.rotation = go.parentObject.rotation;
((Component)go).transform.Rotate(inspectRotation);
}
}
protected void RandomScanNumber()
{
if (!((Object)(object)scanNode == (Object)null))
{
Random.InitState((int)((Component)this).gameObject.GetComponent<NetworkObject>().NetworkObjectId);
scanNode.headerText = rsnScanName + " #" + Random.RandomRangeInt((int)rsnMinMax.x, (int)rsnMinMax.y + 1);
}
}
}
public class BrutalStare : MonoBehaviour
{
[SerializeField]
private Transform marioHead;
private PlayerControllerB player;
private GrabbableObject go;
private void Start()
{
player = GameNetworkManager.Instance.localPlayerController;
go = ((Component)this).GetComponent<GrabbableObject>();
}
private void Update()
{
//IL_0080: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)player == (Object)null) && !((Object)(object)marioHead == (Object)null) && (Object)(object)((Component)this).gameObject.GetComponent<GrabbableObject>() != (Object)null)
{
if ((Object)(object)go.playerHeldBy != (Object)(object)player || go.playerHeldBy.IsInspectingItem)
{
marioHead.LookAt(2f * marioHead.position - player.cameraContainerTransform.position);
}
if ((Object)(object)go.playerHeldBy == (Object)(object)player && !go.playerHeldBy.IsInspectingItem)
{
marioHead.localRotation = Quaternion.Euler(0f, 188f, 0f);
}
}
}
}
public class CoomerSpeech : MonoBehaviour
{
private CustomNoisemaker nm;
private AudioSource source;
public float updateStep = 0.02f;
public int sampleDataLength = 1024;
public Transform mouth;
private float mouthInitX;
private float mouthInitY;
private float currentUpdateTime = 0f;
private float clipLoudness;
private float[] clipSampleData;
private void Awake()
{
//IL_0025: 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)
nm = ((Component)this).GetComponent<CustomNoisemaker>();
clipSampleData = new float[sampleDataLength];
mouthInitX = mouth.localPosition.x;
mouthInitY = mouth.localPosition.y;
}
private void Update()
{
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0204: Unknown result type (might be due to invalid IL or missing references)
//IL_020e: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)mouth == (Object)null)
{
return;
}
source = ((!((Object)(object)((GrabbableObject)nm).playerHeldBy != (Object)null)) ? nm.noiseAudio : (((Object)(object)nm.noiseAudio == (Object)null && (Object)(object)((GrabbableObject)nm).playerHeldBy.itemAudio != (Object)null) ? ((GrabbableObject)nm).playerHeldBy.itemAudio : nm.noiseAudio));
if ((Object)(object)source.clip == (Object)null)
{
mouth.localPosition = Vector3.Lerp(mouth.localPosition, new Vector3(mouthInitX, mouthInitY, mouth.localPosition.z), 0.6f);
return;
}
currentUpdateTime += Time.deltaTime;
if (currentUpdateTime >= updateStep)
{
currentUpdateTime = 0f;
source.clip.GetData(clipSampleData, source.timeSamples);
clipLoudness = 0f;
float[] array = clipSampleData;
foreach (float num in array)
{
clipLoudness += Mathf.Abs(num);
}
clipLoudness /= sampleDataLength;
}
mouth.localPosition = Vector3.Lerp(mouth.localPosition, new Vector3(Mathf.Clamp(mouthInitX + clipLoudness * 30f, mouthInitX, mouthInitX + 0.85f), Mathf.Clamp(mouthInitY + clipLoudness * 20f, mouthInitY, mouthInitY + 0.28f), mouth.localPosition.z), 0.8f);
}
}
public class FoodProp : GrabbableObject
{
public int healPower = 50;
public float staminaPower = 0.5f;
public Vector3? originalPosition = null;
public Vector3? originalRotation = null;
public AudioClip eatSound;
public override void ItemActivate(bool used, bool buttonDown = true)
{
//IL_0038: 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_006d: 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)
((GrabbableObject)this).ItemActivate(used, buttonDown);
if ((Object)(object)base.playerHeldBy != (Object)null && !base.playerHeldBy.activatingItem)
{
originalPosition = base.itemProperties.positionOffset;
originalRotation = base.itemProperties.rotationOffset;
UpdatePosRotServerRpc(new Vector3(0.1f, 0.1f, 0f), new Vector3(90f, 90f, -90f));
base.playerHeldBy.activatingItem = buttonDown;
base.playerHeldBy.playerBodyAnimator.SetBool("useTZPItem", buttonDown);
((MonoBehaviour)this).StartCoroutine(FoodEffect(base.playerHeldBy));
}
}
private IEnumerator FoodEffect(PlayerControllerB player)
{
yield return (object)new WaitForSeconds(0.8f);
base.playerHeldBy.itemAudio.clip = eatSound;
base.playerHeldBy.itemAudio.volume = 1f;
base.playerHeldBy.itemAudio.Play();
WalkieTalkie.TransmitOneShotAudio(base.playerHeldBy.itemAudio, base.playerHeldBy.itemAudio.clip, 1f);
UpdatePosRotServerRpc((Vector3)(originalPosition.HasValue ? originalPosition.Value : default(Vector3)), (Vector3)(originalRotation.HasValue ? originalRotation.Value : default(Vector3)));
player.playerBodyAnimator.SetBool("useTZPItem", false);
player.activatingItem = false;
if (!player.isPlayerDead)
{
ulong playerID = StartOfRound.Instance.localPlayerController.playerClientId;
player.sprintMeter += staminaPower;
player.sprintMeter = Mathf.Clamp(player.sprintMeter, 0f, 1f);
UtilEffects.HealPlayerServerRpc(playerID, (player.health + healPower > 100) ? 100 : (player.health + healPower));
UtilEffects.DestroyObjectServerRpc(NetworkObjectReference.op_Implicit(((Component)this).gameObject.GetComponent<NetworkObject>()));
}
}
[ServerRpc(RequireOwnership = false)]
private void UpdatePosRotServerRpc(Vector3 newPos, Vector3 newRot)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
UpdatePosRotClientRpc(newPos, newRot);
}
[ClientRpc]
private void UpdatePosRotClientRpc(Vector3 newPos, Vector3 newRot)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
base.itemProperties.positionOffset = newPos;
base.itemProperties.rotationOffset = newRot;
}
}
internal class PCExplosion : NoisemakerProp
{
public LethalClientMessage<Vector3> pcBoomID;
public override void Start()
{
((NoisemakerProp)this).Start();
pcBoomID = new LethalClientMessage<Vector3>("boysclubPCExplosionID" + ((Component)this).gameObject.GetComponent<NetworkObject>().NetworkObjectId, (Action<Vector3>)null, (Action<Vector3, ulong>)null);
pcBoomID.OnReceivedFromClient += SpawnExplosionNetwork;
}
private void SpawnExplosionNetwork(Vector3 position, ulong clientId)
{
((MonoBehaviour)this).StartCoroutine(SpawnTheExplosion());
}
private IEnumerator SpawnTheExplosion()
{
yield return ((MonoBehaviour)this).StartCoroutine(UtilEffects.Explosion(5, 2.75f, (GrabbableObject)(object)this));
UtilEffects.Spawn("PileOfAshItem", ((Component)this).transform.position + Vector3.up);
UtilEffects.DestroyObjectServerRpc(NetworkObjectReference.op_Implicit(((Component)this).gameObject.GetComponent<NetworkObject>()));
}
public override void ItemActivate(bool used, bool buttonDown = true)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
((NoisemakerProp)this).ItemActivate(used, buttonDown);
if (buttonDown && (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null)
{
pcBoomID.SendAllClients(((Component)((GrabbableObject)this).playerHeldBy).transform.position, true, false);
}
}
}
public class SpawnObjectOnScrapPoints : MonoBehaviour
{
private GrabbableObject item;
[SerializeField]
private bool isKewtianPlanets;
public Transform objContainer;
private List<Transform> objSpots = new List<Transform>();
public GameObject[] objPrefabs;
public void Start()
{
item = ((Component)this).gameObject.GetComponent<GrabbableObject>();
if (isKewtianPlanets && ((Plugin.allowedHeadcanons.Contains("none".TrimStart()) && Regex.IsMatch(item.itemProperties.itemName, "\\W*(Amy Rose Statue|Toadette Statue|Toad Statue|Villager Statue|Tenacious Fyre|Toon Link Statue)\\W*")) || (!Plugin.allowedHeadcanons.Contains("all".TrimStart()) && ((!Plugin.allowedHeadcanons.Contains("amy".TrimStart()) && Regex.IsMatch(item.itemProperties.itemName, "Amy Rose Statue")) || (!Plugin.allowedHeadcanons.Contains("villager".TrimStart()) && Regex.IsMatch(item.itemProperties.itemName, "Villager Statue")) || (!Plugin.allowedHeadcanons.Contains("toon link".TrimStart()) && Regex.IsMatch(item.itemProperties.itemName, "Toon Link Statue")) || (!Plugin.allowedHeadcanons.Contains("toadette".TrimStart()) && Regex.IsMatch(item.itemProperties.itemName, "Toadette Statue")) || (!Plugin.allowedHeadcanons.Contains("toad".TrimStart()) && Regex.IsMatch(item.itemProperties.itemName, "Toad Statue")) || (!Plugin.allowedHeadcanons.Contains("fyre".TrimStart()) && Regex.IsMatch(item.itemProperties.itemName, "Tenacious Fyre"))))))
{
((Behaviour)this).enabled = false;
}
else
{
if ((Object)(object)objContainer == (Object)null)
{
return;
}
foreach (Transform item in from go in ((Component)objContainer).GetComponentsInChildren<Transform>()
where (Object)(object)go != (Object)(object)objContainer
select go)
{
objSpots.Add(item);
}
if (objSpots.Count != 0 && !((Object)(object)objContainer == (Object)null) && !((Object)(object)this.item == (Object)null))
{
Random.InitState((int)((Component)this).gameObject.GetComponent<NetworkObject>().NetworkObjectId);
if (Random.Range(0, 5) == 0)
{
GameObject val = Object.Instantiate<GameObject>(objPrefabs[Random.Range(0, objPrefabs.Length)], objSpots[Random.Range(0, objSpots.Count)]);
}
}
}
}
}
internal class TielExplosion : PhysicsProp
{
public LethalClientMessage<Vector3> tielBoomID;
[SerializeField]
private Transform hoodDown;
[SerializeField]
private Transform hoodUp;
[SerializeField]
private Transform tiel;
public override void Start()
{
((GrabbableObject)this).Start();
tielBoomID = new LethalClientMessage<Vector3>("boysclubtielBoomID" + ((Component)this).gameObject.GetComponent<NetworkObject>().NetworkObjectId, (Action<Vector3>)null, (Action<Vector3, ulong>)null);
tielBoomID.OnReceivedFromClient += SpawnExplosionNetwork;
Random.InitState((int)((Component)this).gameObject.GetComponent<NetworkObject>().NetworkObjectId);
int num = Random.RandomRangeInt(0, 2);
Transform obj = tiel;
if (obj != null)
{
((Component)obj).gameObject.GetComponent<SkinnedMeshRenderer>().SetBlendShapeWeight(0, (float)((num == 1) ? 100 : 0));
}
Transform obj2 = hoodUp;
if (obj2 != null)
{
((Component)obj2).gameObject.SetActive(num != 1);
}
Transform obj3 = hoodDown;
if (obj3 != null)
{
((Component)obj3).gameObject.SetActive(num == 1);
}
}
private void SpawnExplosionNetwork(Vector3 position, ulong clientId)
{
//IL_000b: 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)
((MonoBehaviour)this).StartCoroutine(UtilEffects.Explosion(8, 0f, (GrabbableObject)(object)this));
}
public override void ItemActivate(bool used, bool buttonDown = true)
{
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
((GrabbableObject)this).ItemActivate(used, buttonDown);
if (buttonDown && (Object)(object)((GrabbableObject)this).playerHeldBy != (Object)null)
{
tielBoomID.SendAllClients(((Component)((GrabbableObject)this).playerHeldBy).transform.position, true, false);
}
}
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
internal sealed class IgnoresAccessChecksToAttribute : Attribute
{
public IgnoresAccessChecksToAttribute(string assemblyName)
{
}
}
}