using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using MoreCompany.Cosmetics;
using MoreCompany.Utils;
using Steamworks;
using Steamworks.Data;
using TMPro;
using Unity.Netcode;
using Unity.Netcode.Transports.UTP;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("MoreCompany")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyCopyright("Copyright © NotNotSwipez 2023")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("MoreCompany")]
[assembly: AssemblyTitle("MoreCompany")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace MoreCompany
{
[HarmonyPatch(typeof(AudioMixer), "SetFloat")]
public static class AudioMixerSetFloatPatch
{
public static bool Prefix(string name, float value)
{
if (name.StartsWith("PlayerVolume") || name.StartsWith("PlayerPitch"))
{
string s = name.Replace("PlayerVolume", "").Replace("PlayerPitch", "");
int num = int.Parse(s);
PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[num];
if ((Object)(object)val != (Object)null)
{
AudioSource currentVoiceChatAudioSource = val.currentVoiceChatAudioSource;
if (Object.op_Implicit((Object)(object)currentVoiceChatAudioSource))
{
if (name.StartsWith("PlayerVolume"))
{
currentVoiceChatAudioSource.volume = value / 16f;
}
else if (name.StartsWith("PlayerPitch"))
{
currentVoiceChatAudioSource.pitch = value;
}
}
return false;
}
}
return true;
}
}
[HarmonyPatch(typeof(HUDManager), "AddTextToChatOnServer")]
public static class SendChatToServerPatch
{
public static bool Prefix(string chatMessage, int playerId = -1)
{
if (((NetworkBehaviour)StartOfRound.Instance).IsHost && chatMessage.StartsWith("/mc") && DebugCommandRegistry.commandEnabled)
{
string text = chatMessage.Replace("/mc ", "");
DebugCommandRegistry.HandleCommand(text.Split(' '));
return false;
}
return true;
}
}
[HarmonyPatch]
public static class ClientReceiveMessagePatch
{
internal enum __RpcExecStage
{
None,
Server,
Client
}
internal static MethodInfo AddTextMessageServerRpc = AccessTools.Method(typeof(HUDManager), "AddTextMessageServerRpc", (Type[])null, (Type[])null);
internal static FieldInfo __rpc_exec_stage = AccessTools.Field(typeof(NetworkBehaviour), "__rpc_exec_stage");
[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
[HarmonyPostfix]
public static void ConnectClientToPlayerObject_Postfix(PlayerControllerB __instance)
{
MainClass.playerIdsAndCosmetics.Clear();
string text = $"[morecompanycosmetics];{__instance.playerClientId};-1";
foreach (string locallySelectedCosmetic in CosmeticRegistry.locallySelectedCosmetics)
{
if (CosmeticRegistry.cosmeticInstances.ContainsKey(locallySelectedCosmetic))
{
text = text + ";" + locallySelectedCosmetic;
}
}
AddTextMessageServerRpc?.Invoke(HUDManager.Instance, new object[1] { text });
}
[HarmonyPatch(typeof(HUDManager), "AddTextMessageServerRpc")]
[HarmonyPostfix]
public static void AddTextMessageServerRpc_Postfix(HUDManager __instance, string chatMessage)
{
if (!chatMessage.StartsWith("[morecompanycosmetics]"))
{
return;
}
NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager;
if ((Object)(object)networkManager == (Object)null || !networkManager.IsListening || (__RpcExecStage)__rpc_exec_stage.GetValue(__instance) == __RpcExecStage.Server || !networkManager.IsHost)
{
return;
}
string[] array = chatMessage.Split(';');
int num = int.Parse(array[1]);
int num2 = int.Parse(array[2]);
if (num2 != -1)
{
return;
}
foreach (KeyValuePair<int, List<string>> item in MainClass.playerIdsAndCosmetics.ToList())
{
if (item.Key == num)
{
continue;
}
string text = $"[morecompanycosmetics];{item.Key};{num}";
foreach (string item2 in item.Value)
{
text = text + ";" + item2;
}
AddTextMessageServerRpc?.Invoke(__instance, new object[1] { text });
}
}
[HarmonyPatch(typeof(HUDManager), "AddTextMessageClientRpc")]
[HarmonyPrefix]
public static void AddTextMessageClientRpc_Prefix(HUDManager __instance, string chatMessage)
{
if (chatMessage.StartsWith("[morecompanycosmetics]"))
{
NetworkManager networkManager = ((NetworkBehaviour)__instance).NetworkManager;
if (!((Object)(object)networkManager == (Object)null) && networkManager.IsListening && (__RpcExecStage)__rpc_exec_stage.GetValue(__instance) == __RpcExecStage.Client && (networkManager.IsClient || networkManager.IsHost))
{
HandleDataMessage(chatMessage);
}
}
}
internal static void HandleDataMessage(string chatMessage)
{
//IL_0150: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
string[] array = chatMessage.Split(';');
int num = int.Parse(array[1]);
int num2 = int.Parse(array[2]);
array = array.Skip(3).ToArray();
if (num2 != -1 && num2 != StartOfRound.Instance.thisClientPlayerId)
{
return;
}
CosmeticApplication cosmeticApplication = ((Component)((Component)StartOfRound.Instance.allPlayerScripts[num]).transform.Find("ScavengerModel").Find("metarig")).gameObject.GetComponent<CosmeticApplication>();
if (!Object.op_Implicit((Object)(object)cosmeticApplication))
{
cosmeticApplication = ((Component)((Component)StartOfRound.Instance.allPlayerScripts[num]).transform.Find("ScavengerModel").Find("metarig")).gameObject.AddComponent<CosmeticApplication>();
}
cosmeticApplication.ClearCosmetics();
List<string> list = new List<string>();
string[] array2 = array;
foreach (string text in array2)
{
list.Add(text);
if (MainClass.cosmeticsSyncOther.Value)
{
cosmeticApplication.ApplyCosmetic(text, startEnabled: true);
}
}
if (num == StartOfRound.Instance.thisClientPlayerId)
{
cosmeticApplication.ClearCosmetics();
}
foreach (CosmeticInstance spawnedCosmetic in cosmeticApplication.spawnedCosmetics)
{
Transform transform = ((Component)spawnedCosmetic).transform;
transform.localScale *= 0.38f;
}
if (MainClass.playerIdsAndCosmetics.ContainsKey(num))
{
MainClass.playerIdsAndCosmetics[num] = list;
}
else
{
MainClass.playerIdsAndCosmetics.Add(num, list);
}
}
}
[HarmonyPatch]
public static class PreventOldVersionChatSpamPatch
{
[HarmonyPatch(typeof(HUDManager), "AddChatMessage")]
[HarmonyPrefix]
public static bool AddChatMessage_Prefix(string chatMessage, string nameOfUserWhoTyped = "")
{
if (chatMessage.StartsWith("[replacewithdata]") || chatMessage.StartsWith("[morecompanycosmetics]"))
{
return false;
}
return true;
}
[HarmonyPatch(typeof(HUDManager), "AddPlayerChatMessageClientRpc")]
[HarmonyPrefix]
public static bool AddPlayerChatMessageClientRpc_Prefix(string chatMessage, int playerId)
{
if (chatMessage.StartsWith("[replacewithdata]") || chatMessage.StartsWith("[morecompanycosmetics]"))
{
return false;
}
return true;
}
}
public class DebugCommandRegistry
{
public static bool commandEnabled;
public static void HandleCommand(string[] args)
{
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_0164: 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_018a: Unknown result type (might be due to invalid IL or missing references)
//IL_018f: Unknown result type (might be due to invalid IL or missing references)
//IL_026f: Unknown result type (might be due to invalid IL or missing references)
//IL_027a: Unknown result type (might be due to invalid IL or missing references)
//IL_0284: Unknown result type (might be due to invalid IL or missing references)
//IL_0289: Unknown result type (might be due to invalid IL or missing references)
//IL_029b: Unknown result type (might be due to invalid IL or missing references)
if (!commandEnabled)
{
return;
}
PlayerControllerB localPlayerController = StartOfRound.Instance.localPlayerController;
switch (args[0])
{
case "money":
{
int groupCredits = int.Parse(args[1]);
Terminal val5 = Resources.FindObjectsOfTypeAll<Terminal>().First();
val5.groupCredits = groupCredits;
break;
}
case "spawnscrap":
{
string text = "";
for (int i = 1; i < args.Length; i++)
{
text = text + args[i] + " ";
}
text = text.Trim();
Vector3 val = ((Component)localPlayerController).transform.position + ((Component)localPlayerController).transform.forward * 2f;
SpawnableItemWithRarity val2 = null;
foreach (SpawnableItemWithRarity item in StartOfRound.Instance.currentLevel.spawnableScrap)
{
if (item.spawnableItem.itemName.ToLower() == text.ToLower())
{
val2 = item;
break;
}
}
GameObject val3 = Object.Instantiate<GameObject>(val2.spawnableItem.spawnPrefab, val, Quaternion.identity, (Transform)null);
GrabbableObject component = val3.GetComponent<GrabbableObject>();
((Component)component).transform.rotation = Quaternion.Euler(component.itemProperties.restingRotation);
component.fallTime = 0f;
NetworkObject component2 = val3.GetComponent<NetworkObject>();
component2.Spawn(false);
break;
}
case "spawnenemy":
{
string text2 = "";
for (int j = 1; j < args.Length; j++)
{
text2 = text2 + args[j] + " ";
}
text2 = text2.Trim();
SpawnableEnemyWithRarity val4 = null;
foreach (SpawnableEnemyWithRarity enemy in StartOfRound.Instance.currentLevel.Enemies)
{
if (enemy.enemyType.enemyName.ToLower() == text2.ToLower())
{
val4 = enemy;
break;
}
}
RoundManager.Instance.SpawnEnemyGameObject(((Component)localPlayerController).transform.position + ((Component)localPlayerController).transform.forward * 2f, 0f, -1, val4.enemyType);
break;
}
case "listall":
MainClass.StaticLogger.LogInfo((object)"Spawnable scrap:");
foreach (SpawnableItemWithRarity item2 in StartOfRound.Instance.currentLevel.spawnableScrap)
{
MainClass.StaticLogger.LogInfo((object)item2.spawnableItem.itemName);
}
MainClass.StaticLogger.LogInfo((object)"Spawnable enemies:");
{
foreach (SpawnableEnemyWithRarity enemy2 in StartOfRound.Instance.currentLevel.Enemies)
{
MainClass.StaticLogger.LogInfo((object)enemy2.enemyType.enemyName);
}
break;
}
}
}
}
[HarmonyPatch(typeof(ForestGiantAI), "LookForPlayers")]
public static class LookForPlayersForestGiantPatch
{
public static void Prefix(ref ForestGiantAI __instance)
{
if (__instance.playerStealthMeters.Length != MainClass.newPlayerCount)
{
Array.Resize(ref __instance.playerStealthMeters, MainClass.newPlayerCount);
for (int i = 0; i < MainClass.newPlayerCount; i++)
{
__instance.playerStealthMeters[i] = 0f;
}
}
}
}
[HarmonyPatch(typeof(BlobAI), "Start")]
public static class BlobAIStartPatch
{
public static void Postfix(ref BlobAI __instance)
{
Collider[] value = (Collider[])(object)new Collider[MainClass.newPlayerCount];
ReflectionUtils.SetFieldValue(__instance, "ragdollColliders", value);
}
}
[HarmonyPatch(typeof(CrawlerAI), "Start")]
public static class CrawlerAIStartPatch
{
public static void Postfix(ref CrawlerAI __instance)
{
Collider[] value = (Collider[])(object)new Collider[MainClass.newPlayerCount];
ReflectionUtils.SetFieldValue(__instance, "nearPlayerColliders", value);
}
}
[HarmonyPatch(typeof(SpringManAI), "Update")]
public static class SpringManAIUpdatePatch
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
bool flag2 = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag2)
{
if (!flag && ((object)instruction).ToString() == "call static float UnityEngine.Vector3::Distance(UnityEngine.Vector3 a, UnityEngine.Vector3 b)")
{
flag = true;
}
else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag2 = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
continue;
}
}
list.Add(instruction);
}
if (!flag2)
{
MainClass.StaticLogger.LogWarning((object)"SpringManAIUpdatePatch failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(SpringManAI), "DoAIInterval")]
public static class SpringManAIIntervalPatch
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
bool flag2 = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag2)
{
if (!flag && ((object)instruction).ToString() == "call void EnemyAI::SwitchToBehaviourState(int stateIndex)")
{
flag = true;
}
else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag2 = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
continue;
}
}
list.Add(instruction);
}
if (!flag2)
{
MainClass.StaticLogger.LogWarning((object)"SpringManAIIntervalPatch failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(EnemyAI), "GetClosestPlayer")]
public static class GetClosestPlayerPatch
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
}
else
{
list.Add(instruction);
}
}
if (!flag)
{
MainClass.StaticLogger.LogWarning((object)"GetClosestPlayerPatch failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(EnemyAI), "GetAllPlayersInLineOfSight")]
public static class GetAllPlayersInLineOfSightPatch
{
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
}
else
{
list.Add(instruction);
}
}
if (!flag)
{
MainClass.StaticLogger.LogWarning((object)"GetAllPlayersInLineOfSightPatch failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(DressGirlAI), "ChoosePlayerToHaunt")]
public static class DressGirlHauntPatch
{
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
int num = 0;
foreach (CodeInstruction instruction in instructions)
{
if (((object)instruction).ToString() == "ldc.i4.4 NULL")
{
num++;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
}
else
{
list.Add(instruction);
}
}
if (num != 3)
{
MainClass.StaticLogger.LogWarning((object)$"DressGirlHauntPatch failed to replace newPlayerCount: {num}/3");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(ButlerEnemyAI), "Start")]
public static class ButlerEnemyAIPatch
{
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
int num = 0;
foreach (CodeInstruction instruction in instructions)
{
if (((object)instruction).ToString() == "ldc.i4.4 NULL")
{
num++;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
}
else
{
list.Add(instruction);
}
}
if (num != 3)
{
MainClass.StaticLogger.LogWarning((object)$"ButlerEnemyAIPatch failed to replace newPlayerCount: {num}/3");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(HUDManager), "AddChatMessage")]
public static class HudChatPatch
{
public static void Prefix(HUDManager __instance, ref string chatMessage, string nameOfUserWhoTyped = "")
{
if (!(__instance.lastChatMessage == chatMessage))
{
StringBuilder stringBuilder = new StringBuilder(chatMessage);
for (int i = 0; i < MainClass.newPlayerCount; i++)
{
string oldValue = $"[playerNum{i}]";
string playerUsername = StartOfRound.Instance.allPlayerScripts[i].playerUsername;
stringBuilder.Replace(oldValue, playerUsername);
}
chatMessage = stringBuilder.ToString();
}
}
}
[HarmonyPatch(typeof(MenuManager), "Awake")]
public static class MenuManagerLogoOverridePatch
{
public static List<TMP_InputField> inputFields = new List<TMP_InputField>();
public static void Postfix(MenuManager __instance)
{
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
try
{
MainClass.ReadSettingsFromFile();
GameObject gameObject = ((Component)((Component)__instance).transform.parent).gameObject;
Sprite sprite = Sprite.Create(MainClass.mainLogo, new Rect(0f, 0f, (float)((Texture)MainClass.mainLogo).width, (float)((Texture)MainClass.mainLogo).height), new Vector2(0.5f, 0.5f));
Transform val = gameObject.transform.Find("MenuContainer/MainButtons/HeaderImage");
if ((Object)(object)val != (Object)null)
{
((Component)val).gameObject.GetComponent<Image>().sprite = sprite;
}
Transform val2 = gameObject.transform.Find("MenuContainer/LoadingScreen");
if ((Object)(object)val2 != (Object)null)
{
val2.localScale = new Vector3(1.02f, 1.06f, 1.02f);
Transform val3 = val2.Find("Image");
if ((Object)(object)val3 != (Object)null)
{
((Component)val3).GetComponent<Image>().sprite = sprite;
}
}
CosmeticRegistry.SpawnCosmeticGUI();
LANMenu.InitializeMenu();
inputFields.Clear();
Transform val4 = gameObject.transform.Find("MenuContainer/LobbyHostSettings/HostSettingsContainer/LobbyHostOptions");
if ((Object)(object)val4 != (Object)null)
{
CreateCrewCountInput(val4.Find(GameNetworkManager.Instance.disableSteam ? "LANOptions" : "OptionsNormal"));
}
Transform val5 = gameObject.transform.Find("MenuContainer/LobbyJoinSettings/JoinSettingsContainer/LobbyJoinOptions");
if ((Object)(object)val5 != (Object)null)
{
CreateCrewCountInput(val5.Find("LANOptions"));
}
}
catch (Exception ex)
{
MainClass.StaticLogger.LogError((object)ex);
}
}
private static void CreateCrewCountInput(Transform parent)
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
GameObject val = Object.Instantiate<GameObject>(MainClass.crewCountUI, parent);
RectTransform component = val.GetComponent<RectTransform>();
((Transform)component).localPosition = new Vector3(96.9f, -70f, -6.7f);
TMP_InputField inputField = ((Component)val.transform.Find("InputField (TMP)")).GetComponent<TMP_InputField>();
inputField.characterLimit = 3;
inputField.text = MainClass.newPlayerCount.ToString();
inputFields.Add(inputField);
((UnityEvent<string>)(object)inputField.onSubmit).AddListener((UnityAction<string>)delegate(string s)
{
UpdateTextBox(inputField, s);
});
((UnityEvent<string>)(object)inputField.onDeselect).AddListener((UnityAction<string>)delegate(string s)
{
UpdateTextBox(inputField, s);
});
}
public static void UpdateTextBox(TMP_InputField inputField, string s)
{
if (inputField.text == MainClass.newPlayerCount.ToString())
{
return;
}
if (int.TryParse(s, out var result))
{
int newPlayerCount = MainClass.newPlayerCount;
MainClass.newPlayerCount = Mathf.Clamp(result, MainClass.minPlayerCount, MainClass.maxPlayerCount);
foreach (TMP_InputField inputField2 in inputFields)
{
inputField2.text = MainClass.newPlayerCount.ToString();
}
MainClass.SaveSettingsToFile();
if (MainClass.newPlayerCount != newPlayerCount)
{
MainClass.StaticLogger.LogInfo((object)$"Changed Crew Count: {MainClass.newPlayerCount}");
}
}
else
{
if (s.Length == 0)
{
return;
}
foreach (TMP_InputField inputField3 in inputFields)
{
inputField3.text = MainClass.newPlayerCount.ToString();
inputField3.caretPosition = 1;
}
}
}
}
[HarmonyPatch(typeof(QuickMenuManager), "AddUserToPlayerList")]
public static class AddUserPlayerListPatch
{
private static bool Prefix(QuickMenuManager __instance, ulong steamId, string playerName, int playerObjectId)
{
QuickmenuVisualInjectPatch.PopulateQuickMenu(__instance);
return false;
}
}
[HarmonyPatch(typeof(QuickMenuManager), "RemoveUserFromPlayerList")]
public static class RemoveUserPlayerListPatch
{
public static bool Prefix(QuickMenuManager __instance)
{
QuickmenuVisualInjectPatch.PopulateQuickMenu(__instance);
return false;
}
}
[HarmonyPatch(typeof(QuickMenuManager), "Update")]
public static class QuickMenuUpdatePatch
{
public static bool Prefix()
{
return false;
}
}
[HarmonyPatch(typeof(QuickMenuManager), "NonHostPlayerSlotsEnabled")]
public static class QuickMenuDisplayPatch
{
public static bool Prefix(ref bool __result)
{
__result = false;
for (int i = 1; i < StartOfRound.Instance.allPlayerScripts.Length; i++)
{
PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[i];
if (val.isPlayerControlled || val.isPlayerDead)
{
__result = true;
break;
}
}
return false;
}
}
[HarmonyPatch(typeof(QuickMenuManager), "Start")]
public static class QuickmenuVisualInjectPatch
{
public static GameObject quickMenuScrollInstance;
public static void Postfix(QuickMenuManager __instance)
{
//IL_0050: 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)
GameObject gameObject = ((Component)__instance.playerListPanel.transform.Find("Image")).gameObject;
GameObject val = Object.Instantiate<GameObject>(MainClass.quickMenuScrollParent);
val.transform.SetParent(gameObject.transform);
RectTransform component = val.GetComponent<RectTransform>();
((Transform)component).localPosition = new Vector3(0f, -31.2f, 0f);
((Transform)component).localScale = Vector3.one;
quickMenuScrollInstance = val;
}
public static void PopulateQuickMenu(QuickMenuManager __instance)
{
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
//IL_016b: Unknown result type (might be due to invalid IL or missing references)
//IL_028c: Unknown result type (might be due to invalid IL or missing references)
//IL_0296: Expected O, but got Unknown
//IL_02e6: Unknown result type (might be due to invalid IL or missing references)
//IL_02f0: Expected O, but got Unknown
int childCount = quickMenuScrollInstance.transform.Find("Holder").childCount;
List<GameObject> list = new List<GameObject>();
for (int i = 0; i < childCount; i++)
{
list.Add(((Component)quickMenuScrollInstance.transform.Find("Holder").GetChild(i)).gameObject);
}
foreach (GameObject item in list)
{
Object.Destroy((Object)(object)item);
}
if (!Object.op_Implicit((Object)(object)StartOfRound.Instance))
{
return;
}
for (int j = 0; j < StartOfRound.Instance.allPlayerScripts.Length; j++)
{
PlayerControllerB playerScript = StartOfRound.Instance.allPlayerScripts[j];
if (!playerScript.isPlayerControlled && !playerScript.isPlayerDead)
{
continue;
}
GameObject val = Object.Instantiate<GameObject>(MainClass.playerEntry, quickMenuScrollInstance.transform.Find("Holder"));
RectTransform component = val.GetComponent<RectTransform>();
((Transform)component).localScale = Vector3.one;
((Transform)component).localPosition = new Vector3(0f, 0f - ((Transform)component).localPosition.y, 0f);
TextMeshProUGUI component2 = ((Component)val.transform.Find("PlayerNameButton").Find("PName")).GetComponent<TextMeshProUGUI>();
((TMP_Text)component2).text = playerScript.playerUsername;
Slider playerVolume = ((Component)val.transform.Find("PlayerVolumeSlider")).GetComponent<Slider>();
int finalIndex = j;
((UnityEvent<float>)(object)playerVolume.onValueChanged).AddListener((UnityAction<float>)delegate(float f)
{
if (playerScript.isPlayerControlled || playerScript.isPlayerDead)
{
float num = f / playerVolume.maxValue + 1f;
if (num <= -1f)
{
SoundManager.Instance.playerVoiceVolumes[finalIndex] = -70f;
}
else
{
SoundManager.Instance.playerVoiceVolumes[finalIndex] = num;
}
}
});
if ((Object)(object)StartOfRound.Instance.localPlayerController != (Object)null && StartOfRound.Instance.localPlayerController.playerClientId == playerScript.playerClientId)
{
((Component)playerVolume).gameObject.SetActive(false);
((Component)val.transform.Find("Text (1)")).gameObject.SetActive(false);
}
Button component3 = ((Component)val.transform.Find("KickButton")).GetComponent<Button>();
((UnityEvent)component3.onClick).AddListener((UnityAction)delegate
{
__instance.KickUserFromServer(finalIndex);
});
if (!GameNetworkManager.Instance.isHostingGame)
{
((Component)component3).gameObject.SetActive(false);
}
Button component4 = ((Component)val.transform.Find("ProfileIcon")).GetComponent<Button>();
((UnityEvent)component4.onClick).AddListener((UnityAction)delegate
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
if (!GameNetworkManager.Instance.disableSteam)
{
SteamFriends.OpenUserOverlay(SteamId.op_Implicit(playerScript.playerSteamId), "steamid");
}
});
}
}
}
[HarmonyPatch(typeof(QuickMenuManager), "ConfirmKickUserFromServer")]
public static class KickPatch
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
bool flag2 = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag2)
{
if (!flag && ((object)instruction).ToString() == "ldfld int QuickMenuManager::playerObjToKick")
{
flag = true;
}
else if (flag && ((object)instruction).ToString() == "ldc.i4.3 NULL")
{
flag2 = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
continue;
}
}
list.Add(instruction);
}
if (!flag2)
{
MainClass.StaticLogger.LogWarning((object)"KickPatch failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(HUDManager), "UpdateBoxesSpectateUI")]
public static class SpectatorBoxUpdatePatch
{
public static void Postfix(HUDManager __instance)
{
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
Dictionary<Animator, PlayerControllerB> fieldValue = ReflectionUtils.GetFieldValue<Dictionary<Animator, PlayerControllerB>>(__instance, "spectatingPlayerBoxes");
int num = -64;
int num2 = 0;
int num3 = 0;
int num4 = -70;
int num5 = 230;
int num6 = 4;
foreach (KeyValuePair<Animator, PlayerControllerB> item in fieldValue)
{
if (((Component)item.Key).gameObject.activeInHierarchy)
{
GameObject gameObject = ((Component)item.Key).gameObject;
RectTransform component = gameObject.GetComponent<RectTransform>();
int num7 = (int)Math.Floor((double)num3 / (double)num6);
int num8 = num3 % num6;
int num9 = num8 * num4;
int num10 = num7 * num5;
component.anchoredPosition = Vector2.op_Implicit(new Vector3((float)(num + num10), (float)(num2 + num9), 0f));
num3++;
}
}
}
}
[HarmonyPatch(typeof(HUDManager), "Start")]
public static class HudStartPatch
{
public static void Postfix(HUDManager __instance)
{
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: 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_00f6: 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)
EndOfGameStatUIElements statsUIElements = __instance.statsUIElements;
GameObject gameObject = ((Component)((Component)statsUIElements.playerNamesText[0]).gameObject.transform.parent).gameObject;
GameObject gameObject2 = ((Component)gameObject.transform.parent.parent).gameObject;
GameObject gameObject3 = ((Component)gameObject2.transform.Find("BGBoxes")).gameObject;
gameObject2.transform.parent.Find("DeathScreen").SetSiblingIndex(3);
gameObject3.transform.localScale = new Vector3(2.5f, 1f, 1f);
MakePlayerHolder(4, gameObject, statsUIElements, new Vector3(426.9556f, -0.7932f, 0f));
MakePlayerHolder(5, gameObject, statsUIElements, new Vector3(426.9556f, -115.4483f, 0f));
MakePlayerHolder(6, gameObject, statsUIElements, new Vector3(-253.6783f, -115.4483f, 0f));
MakePlayerHolder(7, gameObject, statsUIElements, new Vector3(-253.6783f, -0.7932f, 0f));
for (int i = 8; i < MainClass.newPlayerCount; i++)
{
MakePlayerHolder(i, gameObject, statsUIElements, new Vector3(10000f, 10000f, 0f));
}
}
public static void MakePlayerHolder(int index, GameObject original, EndOfGameStatUIElements uiElements, Vector3 localPosition)
{
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
if (index + 1 <= MainClass.newPlayerCount)
{
GameObject val = Object.Instantiate<GameObject>(original);
RectTransform component = val.GetComponent<RectTransform>();
RectTransform component2 = original.GetComponent<RectTransform>();
((Transform)component).SetParent(((Transform)component2).parent);
((Transform)component).localScale = new Vector3(1f, 1f, 1f);
((Transform)component).localPosition = localPosition;
GameObject gameObject = ((Component)val.transform.Find("PlayerName1")).gameObject;
GameObject gameObject2 = ((Component)val.transform.Find("Notes")).gameObject;
((Transform)gameObject2.GetComponent<RectTransform>()).localPosition = new Vector3(-95.7222f, 43.3303f, 0f);
GameObject gameObject3 = ((Component)val.transform.Find("Symbol")).gameObject;
if (index >= uiElements.playerNamesText.Length)
{
Array.Resize(ref uiElements.playerNamesText, index + 1);
Array.Resize(ref uiElements.playerStates, index + 1);
Array.Resize(ref uiElements.playerNotesText, index + 1);
}
uiElements.playerNamesText[index] = gameObject.GetComponent<TextMeshProUGUI>();
uiElements.playerNotesText[index] = gameObject2.GetComponent<TextMeshProUGUI>();
uiElements.playerStates[index] = gameObject3.GetComponent<Image>();
}
}
}
public class LANMenu : MonoBehaviour
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static UnityAction <>9__0_0;
internal void <InitializeMenu>b__0_0()
{
TextMeshProUGUI component = GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings/JoinSettingsContainer/PrivatePublicDescription").GetComponent<TextMeshProUGUI>();
if ((Object)(object)component != (Object)null)
{
((TMP_Text)component).text = "The mod will attempt to auto-detect the crew size however you can manually specify it to reduce chance of failure.";
}
GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings").gameObject.SetActive(true);
}
}
public static void InitializeMenu()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Expected O, but got Unknown
//IL_005e: 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_0069: Expected O, but got Unknown
CreateUI();
GameObject val = GameObject.Find("Canvas/MenuContainer/MainButtons/StartLAN");
if (!((Object)(object)val != (Object)null))
{
return;
}
MainClass.StaticLogger.LogInfo((object)"LANMenu startLAN Patched");
val.GetComponent<Button>().onClick = new ButtonClickedEvent();
ButtonClickedEvent onClick = val.GetComponent<Button>().onClick;
object obj = <>c.<>9__0_0;
if (obj == null)
{
UnityAction val2 = delegate
{
TextMeshProUGUI component = GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings/JoinSettingsContainer/PrivatePublicDescription").GetComponent<TextMeshProUGUI>();
if ((Object)(object)component != (Object)null)
{
((TMP_Text)component).text = "The mod will attempt to auto-detect the crew size however you can manually specify it to reduce chance of failure.";
}
GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings").gameObject.SetActive(true);
};
<>c.<>9__0_0 = val2;
obj = (object)val2;
}
((UnityEvent)onClick).AddListener((UnityAction)obj);
}
private static GameObject CreateUI()
{
//IL_0066: 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_01ce: Unknown result type (might be due to invalid IL or missing references)
//IL_028a: Unknown result type (might be due to invalid IL or missing references)
//IL_0294: Expected O, but got Unknown
//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
//IL_02ae: Expected O, but got Unknown
if ((Object)(object)GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings") != (Object)null)
{
return null;
}
GameObject val = GameObject.Find("Canvas/MenuContainer");
if ((Object)(object)val == (Object)null)
{
return null;
}
GameObject val2 = GameObject.Find("Canvas/MenuContainer/LobbyHostSettings");
if ((Object)(object)val2 == (Object)null)
{
return null;
}
GameObject val3 = Object.Instantiate<GameObject>(val2, val2.transform.position, val2.transform.rotation, val.transform);
((Object)val3).name = "LobbyJoinSettings";
Transform val4 = val3.transform.Find("HostSettingsContainer");
if ((Object)(object)val4 != (Object)null)
{
((Object)val4).name = "JoinSettingsContainer";
((Object)((Component)val4).transform.Find("LobbyHostOptions")).name = "LobbyJoinOptions";
Object.Destroy((Object)(object)((Component)val3.transform.Find("ChallengeLeaderboard")).gameObject);
Object.Destroy((Object)(object)((Component)val3.transform.Find("FilesPanel")).gameObject);
Object.Destroy((Object)(object)((Component)((Component)val4).transform.Find("LobbyJoinOptions/OptionsNormal")).gameObject);
Object.Destroy((Object)(object)((Component)((Component)val4).transform.Find("LobbyJoinOptions/LANOptions/AllowRemote")).gameObject);
Object.Destroy((Object)(object)((Component)((Component)val4).transform.Find("LobbyJoinOptions/LANOptions/Local")).gameObject);
Transform val5 = ((Component)val4).transform.Find("LobbyJoinOptions/LANOptions/Header");
if ((Object)(object)val5 != (Object)null)
{
((TMP_Text)((Component)val5).GetComponent<TextMeshProUGUI>()).text = "Join LAN Server:";
}
Transform val6 = ((Component)val4).transform.Find("LobbyJoinOptions/LANOptions/ServerNameField");
if ((Object)(object)val6 != (Object)null)
{
((Component)val6).transform.localPosition = new Vector3(0f, 15f, -6.5f);
((Component)val6).gameObject.SetActive(true);
}
TMP_InputField ip_field = ((Component)val6).GetComponent<TMP_InputField>();
if ((Object)(object)ip_field != (Object)null)
{
TextMeshProUGUI ip_placeholder = ((Component)ip_field.placeholder).GetComponent<TextMeshProUGUI>();
((TMP_Text)ip_placeholder).text = ES3.Load<string>("LANIPAddress", "LCGeneralSaveData", "127.0.0.1");
Transform obj = ((Component)val4).transform.Find("Confirm");
Button val7 = ((obj != null) ? ((Component)obj).GetComponent<Button>() : null);
if ((Object)(object)val7 != (Object)null)
{
val7.onClick = new ButtonClickedEvent();
((UnityEvent)val7.onClick).AddListener((UnityAction)delegate
{
string text = "127.0.0.1";
text = ((!(ip_field.text != "")) ? ((TMP_Text)ip_placeholder).text : ip_field.text);
ES3.Save<string>("LANIPAddress", text, "LCGeneralSaveData");
GameObject.Find("Canvas/MenuContainer/LobbyJoinSettings").gameObject.SetActive(false);
((Component)NetworkManager.Singleton).GetComponent<UnityTransport>().ConnectionData.Address = text;
MainClass.StaticLogger.LogInfo((object)("Listening to LAN server: " + text));
GameObject.Find("MenuManager").GetComponent<MenuManager>().StartAClient();
});
}
}
TextMeshProUGUI component = ((Component)((Component)val4).transform.Find("PrivatePublicDescription")).GetComponent<TextMeshProUGUI>();
if ((Object)(object)component != (Object)null)
{
((TMP_Text)component).text = "The mod will attempt to auto-detect the crew size however you can manually specify it to reduce chance of failure.";
}
((Component)((Component)val4).transform.Find("LobbyJoinOptions/LANOptions")).gameObject.SetActive(true);
}
return val3;
}
}
[HarmonyPatch(typeof(GameNetworkManager), "SetConnectionDataBeforeConnecting")]
public static class ConnectionDataPatch
{
public static void Postfix(ref GameNetworkManager __instance)
{
if (__instance.disableSteam)
{
NetworkManager.Singleton.NetworkConfig.ConnectionData = Encoding.ASCII.GetBytes(__instance.gameVersionNum + "," + MainClass.newPlayerCount);
}
}
}
[HarmonyPatch(typeof(GameNetworkManager), "OnLocalClientConnectionDisapproved")]
public static class ConnectionDisapprovedPatch
{
private static int crewSizeMismatch;
private static IEnumerator delayedReconnect()
{
yield return (object)new WaitForSeconds(0.5f);
GameObject.Find("MenuManager").GetComponent<MenuManager>().StartAClient();
}
private static void Prefix(ref GameNetworkManager __instance, ulong clientId)
{
crewSizeMismatch = 0;
if (!__instance.disableSteam)
{
return;
}
try
{
if (!string.IsNullOrEmpty(NetworkManager.Singleton.DisconnectReason) && NetworkManager.Singleton.DisconnectReason.StartsWith("Crew size mismatch!"))
{
crewSizeMismatch = int.Parse(NetworkManager.Singleton.DisconnectReason.Split("Their size: ")[1].Split(". ")[0]);
}
}
catch
{
}
}
private static void Postfix(ref GameNetworkManager __instance, ulong clientId)
{
if (__instance.disableSteam && crewSizeMismatch != 0)
{
MainClass.newPlayerCount = Mathf.Clamp(crewSizeMismatch, MainClass.minPlayerCount, MainClass.maxPlayerCount);
if (MainClass.newPlayerCount == crewSizeMismatch)
{
GameObject.Find("MenuManager").GetComponent<MenuManager>().menuNotification.SetActive(false);
Object.FindObjectOfType<MenuManager>().SetLoadingScreen(true, (RoomEnter)5, "");
((MonoBehaviour)__instance).StartCoroutine(delayedReconnect());
}
crewSizeMismatch = 0;
}
}
}
public static class PluginInformation
{
public const string PLUGIN_NAME = "MoreCompany";
public const string PLUGIN_VERSION = "1.9.1";
public const string PLUGIN_GUID = "me.swipez.melonloader.morecompany";
}
[BepInPlugin("me.swipez.melonloader.morecompany", "MoreCompany", "1.9.1")]
public class MainClass : BaseUnityPlugin
{
public static int defaultPlayerCount = 32;
public static int minPlayerCount = 4;
public static int maxPlayerCount = 50;
public static int newPlayerCount = 32;
public static ConfigFile StaticConfig;
public static ConfigEntry<int> playerCount;
public static ConfigEntry<bool> cosmeticsSyncOther;
public static ConfigEntry<bool> defaultCosmetics;
public static ConfigEntry<bool> cosmeticsPerProfile;
public static Texture2D mainLogo;
public static GameObject quickMenuScrollParent;
public static GameObject playerEntry;
public static GameObject crewCountUI;
public static GameObject cosmeticGUIInstance;
public static GameObject cosmeticButton;
public static ManualLogSource StaticLogger;
public static Dictionary<int, List<string>> playerIdsAndCosmetics = new Dictionary<int, List<string>>();
public static string dynamicCosmeticsPath;
public static string cosmeticSavePath;
private void Awake()
{
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Expected O, but got Unknown
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Expected O, but got Unknown
StaticLogger = ((BaseUnityPlugin)this).Logger;
StaticConfig = ((BaseUnityPlugin)this).Config;
playerCount = StaticConfig.Bind<int>("General", "Player Count", defaultPlayerCount, new ConfigDescription("How many players can be in your lobby?", (AcceptableValueBase)(object)new AcceptableValueRange<int>(minPlayerCount, maxPlayerCount), Array.Empty<object>()));
cosmeticsSyncOther = StaticConfig.Bind<bool>("Cosmetics", "Show Cosmetics", true, "Should you be able to see cosmetics of other players?");
defaultCosmetics = StaticConfig.Bind<bool>("Cosmetics", "Default Cosmetics", true, "Should the default cosmetics be enabled?");
cosmeticsPerProfile = StaticConfig.Bind<bool>("Cosmetics", "Per Profile Cosmetics", false, "Should the cosmetics be saved per-profile?");
Harmony val = new Harmony("me.swipez.melonloader.morecompany");
try
{
val.PatchAll();
}
catch (Exception ex)
{
StaticLogger.LogError((object)("Failed to patch: " + ex));
}
StaticLogger.LogInfo((object)"Loading MoreCompany...");
SteamFriends.OnGameLobbyJoinRequested += delegate(Lobby lobby, SteamId steamId)
{
newPlayerCount = ((Lobby)(ref lobby)).MaxMembers;
};
SteamMatchmaking.OnLobbyEntered += delegate(Lobby lobby)
{
newPlayerCount = ((Lobby)(ref lobby)).MaxMembers;
};
StaticLogger.LogInfo((object)"Loading SETTINGS...");
ReadSettingsFromFile();
dynamicCosmeticsPath = Paths.PluginPath + "/MoreCompanyCosmetics";
if (cosmeticsPerProfile.Value)
{
cosmeticSavePath = Application.persistentDataPath + "/morecompanycosmetics-" + Directory.GetParent(Paths.BepInExRootPath).Name + ".txt";
}
else
{
cosmeticSavePath = Application.persistentDataPath + "/morecompanycosmetics.txt";
}
cosmeticsPerProfile.SettingChanged += delegate
{
if (cosmeticsPerProfile.Value)
{
cosmeticSavePath = Application.persistentDataPath + "/MCCosmeticsSave-" + Directory.GetParent(Paths.BepInExRootPath).Name + ".mcs";
}
else
{
cosmeticSavePath = Application.persistentDataPath + "/MCCosmeticsSave.mcs";
}
};
StaticLogger.LogInfo((object)("Checking: " + dynamicCosmeticsPath));
if (!Directory.Exists(dynamicCosmeticsPath))
{
StaticLogger.LogInfo((object)"Creating cosmetics directory");
Directory.CreateDirectory(dynamicCosmeticsPath);
}
StaticLogger.LogInfo((object)"Loading COSMETICS...");
ReadCosmeticsFromFile();
if (defaultCosmetics.Value)
{
StaticLogger.LogInfo((object)"Loading DEFAULT COSMETICS...");
AssetBundle val2 = BundleUtilities.LoadBundleFromInternalAssembly("morecompany.cosmetics", Assembly.GetExecutingAssembly());
CosmeticRegistry.LoadCosmeticsFromBundle(val2);
val2.Unload(false);
}
StaticLogger.LogInfo((object)"Loading USER COSMETICS...");
RecursiveCosmeticLoad(Paths.PluginPath);
AssetBundle bundle = BundleUtilities.LoadBundleFromInternalAssembly("morecompany.assets", Assembly.GetExecutingAssembly());
LoadAssets(bundle);
StaticLogger.LogInfo((object)"Loaded MoreCompany FULLY");
}
private void RecursiveCosmeticLoad(string directory)
{
string[] directories = Directory.GetDirectories(directory);
foreach (string directory2 in directories)
{
RecursiveCosmeticLoad(directory2);
}
string[] files = Directory.GetFiles(directory);
foreach (string text in files)
{
if (text.EndsWith(".cosmetics"))
{
AssetBundle val = AssetBundle.LoadFromFile(text);
CosmeticRegistry.LoadCosmeticsFromBundle(val);
val.Unload(false);
}
}
}
private void ReadCosmeticsFromFile()
{
if (File.Exists(cosmeticSavePath))
{
string[] array = File.ReadAllLines(cosmeticSavePath);
string[] array2 = array;
foreach (string item in array2)
{
CosmeticRegistry.locallySelectedCosmetics.Add(item);
}
}
}
public static void WriteCosmeticsToFile()
{
string text = "";
foreach (string locallySelectedCosmetic in CosmeticRegistry.locallySelectedCosmetics)
{
text = text + locallySelectedCosmetic + "\n";
}
File.WriteAllText(cosmeticSavePath, text);
}
public static void SaveSettingsToFile()
{
playerCount.Value = newPlayerCount;
StaticConfig.Save();
}
public static void ReadSettingsFromFile()
{
try
{
newPlayerCount = Mathf.Clamp(playerCount.Value, minPlayerCount, maxPlayerCount);
}
catch
{
newPlayerCount = defaultPlayerCount;
playerCount.Value = newPlayerCount;
StaticConfig.Save();
}
}
private static void LoadAssets(AssetBundle bundle)
{
if (Object.op_Implicit((Object)(object)bundle))
{
mainLogo = bundle.LoadPersistentAsset<Texture2D>("assets/morecompanyassets/morecompanytransparentred.png");
quickMenuScrollParent = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/quickmenuoverride.prefab");
playerEntry = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/playerlistslot.prefab");
cosmeticGUIInstance = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/testoverlay.prefab");
cosmeticButton = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/cosmeticinstance.prefab");
crewCountUI = bundle.LoadPersistentAsset<GameObject>("assets/morecompanyassets/crewcountfield.prefab");
bundle.Unload(false);
}
}
public static void ResizePlayerCache(Dictionary<uint, Dictionary<int, NetworkObject>> ScenePlacedObjects)
{
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
//IL_025d: Unknown result type (might be due to invalid IL or missing references)
//IL_0296: Unknown result type (might be due to invalid IL or missing references)
//IL_029c: Expected O, but got Unknown
//IL_02da: Unknown result type (might be due to invalid IL or missing references)
//IL_02e4: Expected O, but got Unknown
StartOfRound instance = StartOfRound.Instance;
if (instance.allPlayerObjects.Length != newPlayerCount)
{
StaticLogger.LogInfo((object)$"ResizePlayerCache: {newPlayerCount}");
uint num = 10000u;
int num2 = instance.allPlayerObjects.Length;
int num3 = newPlayerCount - num2;
Array.Resize(ref instance.allPlayerObjects, newPlayerCount);
Array.Resize(ref instance.allPlayerScripts, newPlayerCount);
Array.Resize(ref instance.gameStats.allPlayerStats, newPlayerCount);
Array.Resize(ref instance.playerSpawnPositions, newPlayerCount);
StaticLogger.LogInfo((object)$"Resizing player cache from {num2} to {newPlayerCount} with difference of {num3}");
if (num3 > 0)
{
GameObject val = instance.allPlayerObjects[3];
for (int i = 0; i < num3; i++)
{
uint num4 = num + (uint)i;
GameObject val2 = Object.Instantiate<GameObject>(val, val.transform.parent);
NetworkObject component = val2.GetComponent<NetworkObject>();
ReflectionUtils.SetFieldValue(component, "GlobalObjectIdHash", num4);
Scene scene = ((Component)component).gameObject.scene;
int handle = ((Scene)(ref scene)).handle;
uint num5 = num4;
if (!ScenePlacedObjects.ContainsKey(num5))
{
ScenePlacedObjects.Add(num5, new Dictionary<int, NetworkObject>());
}
if (ScenePlacedObjects[num5].ContainsKey(handle))
{
string arg = (((Object)(object)ScenePlacedObjects[num5][handle] != (Object)null) ? ((Object)ScenePlacedObjects[num5][handle]).name : "Null Entry");
throw new Exception(((Object)component).name + " tried to registered with ScenePlacedObjects which already contains " + string.Format("the same {0} value {1} for {2}!", "GlobalObjectIdHash", num5, arg));
}
ScenePlacedObjects[num5].Add(handle, component);
((Object)val2).name = $"Player ({4 + i})";
PlayerControllerB componentInChildren = val2.GetComponentInChildren<PlayerControllerB>();
componentInChildren.playerClientId = (ulong)(4 + i);
componentInChildren.playerUsername = $"Player #{componentInChildren.playerClientId}";
componentInChildren.isPlayerControlled = false;
componentInChildren.isPlayerDead = false;
componentInChildren.DropAllHeldItems(false, false);
componentInChildren.TeleportPlayer(instance.notSpawnedPosition.position, false, 0f, false, true);
UnlockableSuit.SwitchSuitForPlayer(componentInChildren, 0, false);
instance.allPlayerObjects[num2 + i] = val2;
instance.gameStats.allPlayerStats[num2 + i] = new PlayerStats();
instance.allPlayerScripts[num2 + i] = componentInChildren;
instance.playerSpawnPositions[num2 + i] = instance.playerSpawnPositions[3];
StartOfRound.Instance.mapScreen.radarTargets.Add(new TransformAndName(((Component)componentInChildren).transform, componentInChildren.playerUsername, false));
}
}
}
PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
foreach (PlayerControllerB val3 in allPlayerScripts)
{
((TMP_Text)val3.usernameBillboardText).text = val3.playerUsername;
}
}
}
[HarmonyPatch(typeof(PlayerControllerB), "Start")]
public static class PlayerControllerBStartPatch
{
public static void Postfix(ref PlayerControllerB __instance)
{
Collider[] value = (Collider[])(object)new Collider[MainClass.newPlayerCount];
ReflectionUtils.SetFieldValue(__instance, "nearByPlayers", value);
}
}
[HarmonyPatch(typeof(PlayerControllerB), "SendNewPlayerValuesServerRpc")]
public static class SendNewPlayerValuesServerRpcPatch
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
bool flag2 = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag2)
{
if (!flag && ((object)instruction).ToString() == "callvirt virtual void System.Collections.Generic.List<ulong>::Add(ulong item)")
{
flag = true;
}
else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag2 = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
continue;
}
}
list.Add(instruction);
}
if (!flag2)
{
MainClass.StaticLogger.LogWarning((object)"SendNewPlayerValuesServerRpcPatch failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(HUDManager), "SyncAllPlayerLevelsServerRpc", new Type[] { })]
public static class SyncAllPlayerLevelsPatch
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
int num = 0;
foreach (CodeInstruction instruction in instructions)
{
if (((object)instruction).ToString() == "ldc.i4.4 NULL")
{
num++;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
}
else
{
list.Add(instruction);
}
}
if (num != 2)
{
MainClass.StaticLogger.LogWarning((object)$"SyncAllPlayerLevelsPatch failed to replace newPlayerCount: {num}/2");
}
return list.AsEnumerable();
}
}
[HarmonyPatch]
public static class SyncShipUnlockablesPatch
{
[HarmonyPatch(typeof(StartOfRound), "SyncShipUnlockablesServerRpc")]
[HarmonyTranspiler]
private static IEnumerable<CodeInstruction> ServerTranspiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
int num = 0;
foreach (CodeInstruction instruction in instructions)
{
if (num != 2)
{
if (!flag && ((object)instruction).ToString() == "callvirt bool Unity.Netcode.NetworkManager::get_IsHost()")
{
flag = true;
}
else if (((object)instruction).ToString().StartsWith("ldc.i4.4 NULL"))
{
num++;
CodeInstruction val = new CodeInstruction(instruction);
val.opcode = OpCodes.Ldsfld;
val.operand = AccessTools.Field(typeof(MainClass), "newPlayerCount");
list.Add(val);
continue;
}
}
list.Add(instruction);
}
if (num != 2)
{
MainClass.StaticLogger.LogWarning((object)$"SyncShipUnlockablesServerRpc failed to replace newPlayerCount: {num}/2");
}
return list.AsEnumerable();
}
[HarmonyPatch(typeof(StartOfRound), "SyncShipUnlockablesClientRpc")]
[HarmonyTranspiler]
private static IEnumerable<CodeInstruction> ClientTranspiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
bool flag2 = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag2)
{
if (!flag && ((object)instruction).ToString() == "callvirt void UnityEngine.Renderer::set_sharedMaterial(UnityEngine.Material value)")
{
flag = true;
}
else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag2 = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
continue;
}
}
list.Add(instruction);
}
if (!flag2)
{
MainClass.StaticLogger.LogWarning((object)"SyncShipUnlockablesClientRpc failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(NetworkSceneManager), "PopulateScenePlacedObjects")]
public static class ScenePlacedObjectsInitPatch
{
public static void Postfix(ref Dictionary<uint, Dictionary<int, NetworkObject>> ___ScenePlacedObjects)
{
MainClass.ResizePlayerCache(___ScenePlacedObjects);
}
}
[HarmonyPatch(typeof(GameNetworkManager), "LobbyDataIsJoinable")]
public static class LobbyDataJoinablePatch
{
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
bool flag2 = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag2)
{
if (!flag && ((object)instruction).ToString() == "call int Steamworks.Data.Lobby::get_MemberCount()")
{
flag = true;
}
else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag2 = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "maxPlayerCount"));
list.Add(item);
continue;
}
}
list.Add(instruction);
}
if (!flag2)
{
MainClass.StaticLogger.LogWarning((object)"LobbyDataIsJoinable failed to replace maxPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(SteamMatchmaking), "CreateLobbyAsync")]
public static class LobbyThingPatch
{
public static void Prefix(ref int maxMembers)
{
MainClass.ReadSettingsFromFile();
maxMembers = MainClass.newPlayerCount;
}
}
[HarmonyPatch(typeof(GameNetworkManager), "ConnectionApproval")]
public static class ConnectionApproval
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
bool flag2 = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag2)
{
if (!flag && ((object)instruction).ToString() == "ldfld int GameNetworkManager::connectedPlayers")
{
flag = true;
}
else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag2 = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
continue;
}
}
list.Add(instruction);
}
if (!flag2)
{
MainClass.StaticLogger.LogWarning((object)"ConnectionApproval failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
private static void Postfix(ref GameNetworkManager __instance, ref ConnectionApprovalRequest request, ref ConnectionApprovalResponse response)
{
if (response.Approved && __instance.disableSteam)
{
string @string = Encoding.ASCII.GetString(request.Payload);
string[] array = @string.Split(",");
if (!string.IsNullOrEmpty(@string) && (array.Length < 2 || array[1] != MainClass.newPlayerCount.ToString()))
{
response.Reason = $"Crew size mismatch! Their size: {MainClass.newPlayerCount}. Your size: {array[1]}";
response.Approved = false;
}
}
}
}
[HarmonyPatch]
public static class TogglePlayerObjectsPatch
{
[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
[HarmonyPrefix]
private static void ConnectClientToPlayerObject()
{
PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
foreach (PlayerControllerB val in allPlayerScripts)
{
if (val.isPlayerControlled || val.isPlayerDead)
{
((Component)val).gameObject.SetActive(true);
}
else
{
((Component)val).gameObject.SetActive(false);
}
}
}
[HarmonyPatch(typeof(StartOfRound), "OnPlayerConnectedClientRpc")]
[HarmonyPrefix]
private static void OnPlayerConnectedClientRpc(StartOfRound __instance, ulong clientId, int connectedPlayers, ulong[] connectedPlayerIdsOrdered, int assignedPlayerObjectId, int serverMoneyAmount, int levelID, int profitQuota, int timeUntilDeadline, int quotaFulfilled, int randomSeed, bool isChallenge)
{
((Component)__instance.allPlayerScripts[assignedPlayerObjectId]).gameObject.SetActive(true);
}
[HarmonyPatch(typeof(StartOfRound), "OnPlayerDC")]
[HarmonyPostfix]
private static void OnPlayerDC(StartOfRound __instance, int playerObjectNumber, ulong clientId)
{
((Component)__instance.allPlayerScripts[playerObjectNumber]).gameObject.SetActive(false);
}
}
public class MimicPatches
{
[HarmonyPatch(typeof(MaskedPlayerEnemy), "SetEnemyOutside")]
public class MaskedPlayerEnemyOnEnablePatch
{
public static void Postfix(ref MaskedPlayerEnemy __instance)
{
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)__instance.mimickingPlayer != (Object)null) || !MainClass.cosmeticsSyncOther.Value || !MainClass.playerIdsAndCosmetics.ContainsKey((int)__instance.mimickingPlayer.playerClientId))
{
return;
}
List<string> list = MainClass.playerIdsAndCosmetics[(int)__instance.mimickingPlayer.playerClientId];
Transform val = ((Component)__instance).transform.Find("ScavengerModel").Find("metarig");
CosmeticApplication component = ((Component)val).GetComponent<CosmeticApplication>();
if (Object.op_Implicit((Object)(object)component))
{
component.ClearCosmetics();
Object.Destroy((Object)(object)component);
}
component = ((Component)val).gameObject.AddComponent<CosmeticApplication>();
foreach (string item in list)
{
component.ApplyCosmetic(item, startEnabled: true);
}
foreach (CosmeticInstance spawnedCosmetic in component.spawnedCosmetics)
{
Transform transform = ((Component)spawnedCosmetic).transform;
transform.localScale *= 0.38f;
}
((EnemyAI)__instance).skinnedMeshRenderers = ((Component)__instance).gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
((EnemyAI)__instance).meshRenderers = ((Component)__instance).gameObject.GetComponentsInChildren<MeshRenderer>();
}
}
}
public class ReflectionUtils
{
public static void InvokeMethod(object obj, string methodName, object[] parameters)
{
Type type = obj.GetType();
MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
method.Invoke(obj, parameters);
}
public static void InvokeMethod(object obj, Type forceType, string methodName, object[] parameters)
{
MethodInfo method = forceType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
method.Invoke(obj, parameters);
}
public static void SetPropertyValue(object obj, string propertyName, object value)
{
Type type = obj.GetType();
PropertyInfo property = type.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
property.SetValue(obj, value);
}
public static T InvokeMethod<T>(object obj, string methodName, object[] parameters)
{
Type type = obj.GetType();
MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
return (T)method.Invoke(obj, parameters);
}
public static T GetFieldValue<T>(object obj, string fieldName)
{
Type type = obj.GetType();
FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
return (T)field.GetValue(obj);
}
public static void SetFieldValue(object obj, string fieldName, object value)
{
Type type = obj.GetType();
FieldInfo field = type.GetField(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
field.SetValue(obj, value);
}
}
[HarmonyPatch(typeof(ShipTeleporter), "Awake")]
public static class ShipTeleporterAwakePatch
{
public static void Postfix(ref ShipTeleporter __instance)
{
int[] array = new int[MainClass.newPlayerCount];
for (int i = 0; i < MainClass.newPlayerCount; i++)
{
array[i] = -1;
}
ReflectionUtils.SetFieldValue(__instance, "playersBeingTeleported", array);
}
}
[HarmonyPatch(typeof(PlayerControllerB), "SpectateNextPlayer")]
public static class SpectatePatches
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
int num = 0;
foreach (CodeInstruction instruction in instructions)
{
if (((object)instruction).ToString() == "ldc.i4.4 NULL")
{
num++;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
}
else
{
list.Add(instruction);
}
}
if (num != 2)
{
MainClass.StaticLogger.LogWarning((object)$"SpectateNextPlayer failed to replace newPlayerCount: {num}/2");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(SoundManager), "Start")]
public static class SoundManagerStartPatch
{
public static void Postfix(ref SoundManager __instance)
{
Array.Resize(ref __instance.playerVoicePitchLerpSpeed, MainClass.newPlayerCount);
Array.Resize(ref __instance.playerVoicePitchTargets, MainClass.newPlayerCount);
Array.Resize(ref __instance.playerVoicePitches, MainClass.newPlayerCount);
Array.Resize(ref __instance.playerVoiceVolumes, MainClass.newPlayerCount);
Array.Resize(ref __instance.playerVoiceMixers, MainClass.newPlayerCount);
AudioMixerGroup val = ((IEnumerable<AudioMixerGroup>)Resources.FindObjectsOfTypeAll<AudioMixerGroup>()).FirstOrDefault((Func<AudioMixerGroup, bool>)((AudioMixerGroup x) => ((Object)x).name.StartsWith("VoicePlayer")));
for (int i = 0; i < MainClass.newPlayerCount; i++)
{
__instance.playerVoicePitchLerpSpeed[i] = 3f;
__instance.playerVoicePitchTargets[i] = 1f;
__instance.playerVoicePitches[i] = 1f;
__instance.playerVoiceVolumes[i] = 0.5f;
if (!Object.op_Implicit((Object)(object)__instance.playerVoiceMixers[i]))
{
AudioMixerGroup val2 = Object.Instantiate<AudioMixerGroup>(val);
((Object)val2).name = $"VoicePlayer{i}";
__instance.playerVoiceMixers[i] = val2;
}
}
}
}
[HarmonyPatch(typeof(StartOfRound), "GetPlayerSpawnPosition")]
public static class SpawnPositionClampPatch
{
public static void Prefix(ref StartOfRound __instance, ref int playerNum, bool simpleTeleport = false)
{
if (!Object.op_Implicit((Object)(object)__instance.playerSpawnPositions[playerNum]))
{
playerNum = __instance.playerSpawnPositions.Length - 1;
}
}
}
[HarmonyPatch(typeof(StartOfRound), "OnClientConnect")]
public static class OnClientConnectedPatch
{
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>();
bool flag = false;
bool flag2 = false;
foreach (CodeInstruction instruction in instructions)
{
if (!flag2)
{
if (!flag && ((object)instruction).ToString() == "callvirt virtual bool System.Collections.Generic.List<int>::Contains(int item)")
{
flag = true;
}
else if (flag && ((object)instruction).ToString() == "ldc.i4.4 NULL")
{
flag2 = true;
CodeInstruction item = new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(MainClass), "newPlayerCount"));
list.Add(item);
continue;
}
}
list.Add(instruction);
}
if (!flag2)
{
MainClass.StaticLogger.LogWarning((object)"OnClientConnect failed to replace newPlayerCount");
}
return list.AsEnumerable();
}
}
[HarmonyPatch(typeof(StartOfRound), "OnPlayerDC")]
public static class OnPlayerDCPatch
{
public static void Postfix(int playerObjectNumber, ulong clientId)
{
if (MainClass.playerIdsAndCosmetics.ContainsKey(playerObjectNumber))
{
MainClass.playerIdsAndCosmetics.Remove(playerObjectNumber);
}
}
}
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
public static class LoadLobbyListAndFilterPatch
{
private static void Postfix()
{
LobbySlot[] array = Object.FindObjectsOfType<LobbySlot>();
LobbySlot[] array2 = array;
foreach (LobbySlot val in array2)
{
((TMP_Text)val.playerCount).text = $"{((Lobby)(ref val.thisLobby)).MemberCount} / {((Lobby)(ref val.thisLobby)).MaxMembers}";
}
}
}
[HarmonyPatch(typeof(GameNetworkManager), "Awake")]
public static class GameNetworkAwakePatch
{
public static int originalVersion;
public static void Postfix(GameNetworkManager __instance)
{
originalVersion = __instance.gameVersionNum;
if (!Chainloader.PluginInfos.ContainsKey("LC_API"))
{
__instance.gameVersionNum = 9950 + originalVersion;
}
}
}
[HarmonyPatch(typeof(MenuManager), "Awake")]
public static class MenuManagerVersionDisplayPatch
{
public static void Postfix(MenuManager __instance)
{
if ((Object)(object)GameNetworkManager.Instance != (Object)null && (Object)(object)__instance.versionNumberText != (Object)null)
{
((TMP_Text)__instance.versionNumberText).text = $"v{GameNetworkAwakePatch.originalVersion} (MC)";
}
}
}
}
namespace MoreCompany.Utils
{
public class BundleUtilities
{
public static byte[] GetResourceBytes(string filename, Assembly assembly)
{
string[] manifestResourceNames = assembly.GetManifestResourceNames();
foreach (string text in manifestResourceNames)
{
if (!text.Contains(filename))
{
continue;
}
using Stream stream = assembly.GetManifestResourceStream(text);
if (stream == null)
{
return null;
}
byte[] array = new byte[stream.Length];
stream.Read(array, 0, array.Length);
return array;
}
return null;
}
public static AssetBundle LoadBundleFromInternalAssembly(string filename, Assembly assembly)
{
return AssetBundle.LoadFromMemory(GetResourceBytes(filename, assembly));
}
}
public static class AssetBundleExtension
{
public static T LoadPersistentAsset<T>(this AssetBundle bundle, string name) where T : Object
{
Object val = bundle.LoadAsset(name);
if (val != (Object)null)
{
val.hideFlags = (HideFlags)32;
return (T)(object)val;
}
return default(T);
}
}
}
namespace MoreCompany.Cosmetics
{
public class CosmeticApplication : MonoBehaviour
{
public Transform head;
public Transform hip;
public Transform lowerArmRight;
public Transform shinLeft;
public Transform shinRight;
public Transform chest;
public List<CosmeticInstance> spawnedCosmetics = new List<CosmeticInstance>();
public void Awake()
{
head = ((Component)this).transform.Find("spine").Find("spine.001").Find("spine.002")
.Find("spine.003")
.Find("spine.004");
chest = ((Component)this).transform.Find("spine").Find("spine.001").Find("spine.002")
.Find("spine.003");
lowerArmRight = ((Component)this).transform.Find("spine").Find("spine.001").Find("spine.002")
.Find("spine.003")
.Find("shoulder.R")
.Find("arm.R_upper")
.Find("arm.R_lower");
hip = ((Component)this).transform.Find("spine");
shinLeft = ((Component)this).transform.Find("spine").Find("thigh.L").Find("shin.L");
shinRight = ((Component)this).transform.Find("spine").Find("thigh.R").Find("shin.R");
RefreshAllCosmeticPositions();
}
private void OnDisable()
{
foreach (CosmeticInstance spawnedCosmetic in spawnedCosmetics)
{
((Component)spawnedCosmetic).gameObject.SetActive(false);
}
}
private void OnEnable()
{
foreach (CosmeticInstance spawnedCosmetic in spawnedCosmetics)
{
((Component)spawnedCosmetic).gameObject.SetActive(true);
}
}
public void ClearCosmetics()
{
foreach (CosmeticInstance spawnedCosmetic in spawnedCosmetics)
{
Object.Destroy((Object)(object)((Component)spawnedCosmetic).gameObject);
}
spawnedCosmetics.Clear();
}
public void ApplyCosmetic(string cosmeticId, bool startEnabled)
{
if (CosmeticRegistry.cosmeticInstances.ContainsKey(cosmeticId))
{
CosmeticInstance cosmeticInstance = CosmeticRegistry.cosmeticInstances[cosmeticId];
GameObject val = Object.Instantiate<GameObject>(((Component)cosmeticInstance).gameObject);
val.SetActive(startEnabled);
CosmeticInstance component = val.GetComponent<CosmeticInstance>();
spawnedCosmetics.Add(component);
if (startEnabled)
{
ParentCosmetic(component);
}
}
}
public void RefreshAllCosmeticPositions()
{
foreach (CosmeticInstance spawnedCosmetic in spawnedCosmetics)
{
ParentCosmetic(spawnedCosmetic);
}
}
private void ParentCosmetic(CosmeticInstance cosmeticInstance)
{
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
Transform val = null;
switch (cosmeticInstance.cosmeticType)
{
case CosmeticType.HAT:
val = head;
break;
case CosmeticType.R_LOWER_ARM:
val = lowerArmRight;
break;
case CosmeticType.HIP:
val = hip;
break;
case CosmeticType.L_SHIN:
val = shinLeft;
break;
case CosmeticType.R_SHIN:
val = shinRight;
break;
case CosmeticType.CHEST:
val = chest;
break;
}
((Component)cosmeticInstance).transform.position = val.position;
((Component)cosmeticInstance).transform.rotation = val.rotation;
((Component)cosmeticInstance).transform.parent = val;
}
}
public class CosmeticInstance : MonoBehaviour
{
public CosmeticType cosmeticType;
public string cosmeticId;
public Texture2D icon;
}
public class CosmeticGeneric
{
public virtual string gameObjectPath { get; }
public virtual string cosmeticId { get; }
public virtual string textureIconPath { get; }
public CosmeticType cosmeticType { get; }
public void LoadFromBundle(AssetBundle bundle)
{
GameObject val = bundle.LoadPersistentAsset<GameObject>(gameObjectPath);
Texture2D icon = bundle.LoadPersistentAsset<Texture2D>(textureIconPath);
CosmeticInstance cosmeticInstance = val.AddComponent<CosmeticInstance>();
cosmeticInstance.cosmeticId = cosmeticId;
cosmeticInstance.icon = icon;
cosmeticInstance.cosmeticType = cosmeticType;
MainClass.StaticLogger.LogInfo((object)("Loaded cosmetic: " + cosmeticId + " from bundle: " + ((Object)bundle).name));
CosmeticRegistry.cosmeticInstances.Add(cosmeticId, cosmeticInstance);
}
}
public enum CosmeticType
{
HAT,
WRIST,
CHEST,
R_LOWER_ARM,
HIP,
L_SHIN,
R_SHIN
}
public class CosmeticRegistry
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static UnityAction <>9__9_0;
public static UnityAction <>9__9_1;
internal void <SpawnCosmeticGUI>b__9_0()
{
MainClass.cosmeticsSyncOther.Value = true;
MainClass.StaticConfig.Save();
}
internal void <SpawnCosmeticGUI>b__9_1()
{
MainClass.cosmeticsSyncOther.Value = false;
MainClass.StaticConfig.Save();
}
}
public static Dictionary<string, CosmeticInstance> cosmeticInstances = new Dictionary<string, CosmeticInstance>();
public static GameObject cosmeticGUI;
private static GameObject displayGuy;
private static CosmeticApplication cosmeticApplication;
public static List<string> locallySelectedCosmetics = new List<string>();
public const float COSMETIC_PLAYER_SCALE_MULT = 0.38f;
public static void LoadCosmeticsFromBundle(AssetBundle bundle)
{
string[] allAssetNames = bundle.GetAllAssetNames();
foreach (string text in allAssetNames)
{
if (!text.EndsWith(".prefab"))
{
continue;
}
GameObject val = bundle.LoadPersistentAsset<GameObject>(text);
CosmeticInstance component = val.GetComponent<CosmeticInstance>();
if (!((Object)(object)component == (Object)null))
{
MainClass.StaticLogger.LogInfo((object)("Loaded cosmetic: " + component.cosmeticId + " from bundle"));
if (cosmeticInstances.ContainsKey(component.cosmeticId))
{
MainClass.StaticLogger.LogError((object)("Duplicate cosmetic id: " + component.cosmeticId));
}
else
{
cosmeticInstances.Add(component.cosmeticId, component);
}
}
}
}
public static void LoadCosmeticsFromAssembly(Assembly assembly, AssetBundle bundle)
{
Type[] types = assembly.GetTypes();
foreach (Type type in types)
{
if (type.IsSubclassOf(typeof(CosmeticGeneric)))
{
CosmeticGeneric cosmeticGeneric = (CosmeticGeneric)type.GetConstructor(new Type[0]).Invoke(new object[0]);
cosmeticGeneric.LoadFromBundle(bundle);
}
}
}
public static void UpdateVisibilityCheckbox(GameObject enableCosmeticsButton, GameObject disableCosmeticsButton)
{
if (MainClass.cosmeticsSyncOther.Value)
{
enableCosmeticsButton.SetActive(false);
disableCosmeticsButton.SetActive(true);
}
else
{
enableCosmeticsButton.SetActive(true);
disableCosmeticsButton.SetActive(false);
}
}
public static void SpawnCosmeticGUI()
{
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: 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_0146: Expected O, but got Unknown
//IL_016b: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0176: Expected O, but got Unknown
cosmeticGUI = Object.Instantiate<GameObject>(MainClass.cosmeticGUIInstance);
((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale")).transform.localScale = new Vector3(2f, 2f, 2f);
displayGuy = ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale").Find("CosmeticsScreen")
.Find("ObjectHolder")
.Find("ScavengerModel")
.Find("metarig")).gameObject;
cosmeticApplication = displayGuy.AddComponent<CosmeticApplication>();
GameObject gameObject = ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale").Find("CosmeticsScreen")
.Find("EnableButton")).gameObject;
GameObject gameObject2 = ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale").Find("CosmeticsScreen")
.Find("DisableButton")).gameObject;
ButtonClickedEvent onClick = gameObject.GetComponent<Button>().onClick;
object obj = <>c.<>9__9_0;
if (obj == null)
{
UnityAction val = delegate
{
MainClass.cosmeticsSyncOther.Value = true;
MainClass.StaticConfig.Save();
};
<>c.<>9__9_0 = val;
obj = (object)val;
}
((UnityEvent)onClick).AddListener((UnityAction)obj);
ButtonClickedEvent onClick2 = gameObject2.GetComponent<Button>().onClick;
object obj2 = <>c.<>9__9_1;
if (obj2 == null)
{
UnityAction val2 = delegate
{
MainClass.cosmeticsSyncOther.Value = false;
MainClass.StaticConfig.Save();
};
<>c.<>9__9_1 = val2;
obj2 = (object)val2;
}
((UnityEvent)onClick2).AddListener((UnityAction)obj2);
UpdateVisibilityCheckbox(gameObject, gameObject2);
PopulateCosmetics();
UpdateCosmeticsOnDisplayGuy(startEnabled: false);
}
public static void PopulateCosmetics()
{
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_021e: Expected O, but got Unknown
GameObject gameObject = ((Component)cosmeticGUI.transform.Find("Canvas").Find("GlobalScale").Find("CosmeticsScreen")
.Find("CosmeticsHolder")
.Find("Content")).gameObject;
List<Transform> list = new List<Transform>();
for (int i = 0; i < gameObject.transform.childCount; i++)
{
list.Add(gameObject.transform.GetChild(i));
}
foreach (Transform item in list)
{
Object.Destroy((Object)(object)((Component)item).gameObject);
}
foreach (KeyValuePair<string, CosmeticInstance> cosmeticInstance in cosmeticInstances)
{
GameObject val = Object.Instantiate<GameObject>(MainClass.cosmeticButton, gameObject.transform);
val.transform.localScale = Vector3.one;
GameObject disabledOverlay = ((Component)val.transform.Find("Deselected")).gameObject;
disabledOverlay.SetActive(true);
GameObject enabledOverlay = ((Component)val.transform.Find("Selected")).gameObject;
enabledOverlay.SetActive(true);
if (IsEquipped(cosmeticInstance.Value.cosmeticId))
{
enabledOverlay.SetActive(true);
disabledOverlay.SetActive(false);
}
else
{
enabledOverlay.SetActive(false);
disabledOverlay.SetActive(true);
}
RawImage component = ((Component)val.transform.Find("Icon")).GetComponent<RawImage>();
component.texture = (Texture)(object)cosmeticInstance.Value.icon;
Button component2 = val.GetComponent<Button>();
((UnityEvent)component2.onClick).AddListener((UnityAction)delegate
{
ToggleCosmetic(cosmeticInstance.Value.cosmeticId);
if (IsEquipped(cosmeticInstance.Value.cosmeticId))
{
enabledOverlay.SetActive(true);
disabledOverlay.SetActive(false);
}
else
{
enabledOverlay.SetActive(false);
disabledOverlay.SetActive(true);
}
MainClass.WriteCosmeticsToFile();
UpdateCosmeticsOnDisplayGuy(startEnabled: true);
});
}
}
private static Color HexToColor(string hex)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
Color result = default(Color);
ColorUtility.TryParseHtmlString(hex, ref result);
return result;
}
public static void UpdateCosmeticsOnDisplayGuy(bool startEnabled)
{
cosmeticApplication.ClearCosmetics();
foreach (string locallySelectedCosmetic in locallySelectedCosmetics)
{
cosmeticApplication.ApplyCosmetic(locallySelectedCosmetic, startEnabled);
}
foreach (CosmeticInstance spawnedCosmetic in cosmeticApplication.spawnedCosmetics)
{
RecursiveLayerChange(((Component)spawnedCosmetic).transform, 5);
}
}
private static void RecursiveLayerChange(Transform transform, int layer)
{
((Component)transform).gameObject.layer = layer;
for (int i = 0; i < transform.childCount; i++)
{
RecursiveLayerChange(transform.GetChild(i), layer);
}
}
public static bool IsEquipped(string cosmeticId)
{
return locallySelectedCosmetics.Contains(cosmeticId);
}
public static void ToggleCosmetic(string cosmeticId)
{
if (locallySelectedCosmetics.Contains(cosmeticId))
{
locallySelectedCosmetics.Remove(cosmeticId);
}
else
{
locallySelectedCosmetics.Add(cosmeticId);
}
}
}
}
namespace MoreCompany.Behaviors
{
public class SpinDragger : MonoBehaviour, IPointerDownHandler, IEventSystemHandler, IPointerUpHandler
{
public float speed = 1f;
private Vector2 lastMousePosition;
private bool dragging = false;
private Vector3 rotationalVelocity = Vector3.zero;
public float dragSpeed = 1f;
public float airDrag = 0.99f;
public GameObject target;
private void Update()
{
//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)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: 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)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
if (dragging)
{
Vector3 val = Vector2.op_Implicit(((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue() - lastMousePosition);
rotationalVelocity += new Vector3(0f, 0f - val.x, 0f) * dragSpeed;
lastMousePosition = ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue();
}
rotationalVelocity *= airDrag;
target.transform.Rotate(rotationalVelocity * Time.deltaTime * speed, (Space)0);
}
public void OnPointerDown(PointerEventData eventData)
{
//IL_000c: 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)
lastMousePosition = ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue();
dragging = true;
}
public void OnPointerUp(PointerEventData eventData)
{
dragging = false;
}
}
}