using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using DunGen;
using GameNetcodeStuff;
using HarmonyLib;
using LethalCompanyMimics.Properties;
using Microsoft.CodeAnalysis;
using Mimics.API;
using Mimics.NetcodePatcher;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Mimics")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("A mod that adds mimics to Lethal Company")]
[assembly: AssemblyFileVersion("2.6.4.0")]
[assembly: AssemblyInformationalVersion("2.6.4")]
[assembly: AssemblyProduct("Mimics")]
[assembly: AssemblyTitle("Mimics")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.6.4.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
internal class <Module>
{
static <Module>()
{
NetworkVariableSerializationTypes.InitializeSerializer_UnmanagedByMemcpy<bool>();
NetworkVariableSerializationTypes.InitializeEqualityChecker_UnmanagedIEquatable<bool>();
}
}
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 LethalCompanyMimics.Properties
{
[GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[DebuggerNonUserCode]
[CompilerGenerated]
internal class Resources
{
private static ResourceManager resourceMan;
private static CultureInfo resourceCulture;
[EditorBrowsable(EditorBrowsableState.Advanced)]
internal static ResourceManager ResourceManager
{
get
{
if (resourceMan == null)
{
ResourceManager resourceManager = new ResourceManager("LethalCompanyMimics.Properties.Resources", typeof(Resources).Assembly);
resourceMan = resourceManager;
}
return resourceMan;
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
internal static CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
internal static byte[] mimicdoor
{
get
{
object @object = ResourceManager.GetObject("mimicdoor", resourceCulture);
return (byte[])@object;
}
}
internal Resources()
{
}
}
}
namespace Mimics
{
[BepInPlugin("x753.Mimics", "Mimics", "2.6.4")]
public class Mimics : BaseUnityPlugin
{
[HarmonyPatch(typeof(GameNetworkManager))]
internal class GameNetworkManagerPatch
{
[HarmonyPatch("Start")]
[HarmonyPostfix]
private static void StartPatch()
{
((Component)GameNetworkManager.Instance).GetComponent<NetworkManager>().AddNetworkPrefab(MimicNetworkerPrefab);
}
}
[HarmonyPatch(typeof(StartOfRound))]
internal class StartOfRoundPatch
{
[HarmonyPatch("Start")]
[HarmonyPostfix]
private static void StartPatch(ref StartOfRound __instance)
{
if (((NetworkBehaviour)__instance).IsServer && (Object)(object)MimicNetworker.Instance == (Object)null)
{
GameObject val = Object.Instantiate<GameObject>(MimicNetworkerPrefab);
val.GetComponent<NetworkObject>().Spawn(true);
MimicNetworker.SpawnWeight0.Value = SpawnRates[0];
MimicNetworker.SpawnWeight1.Value = SpawnRates[1];
MimicNetworker.SpawnWeight2.Value = SpawnRates[2];
MimicNetworker.SpawnWeight3.Value = SpawnRates[3];
MimicNetworker.SpawnWeight4.Value = SpawnRates[4];
MimicNetworker.SpawnWeightMax.Value = SpawnRates[5];
MimicNetworker.SpawnRateDynamic.Value = DynamicSpawnRate;
}
}
}
[HarmonyPatch(typeof(Terminal))]
internal class TerminalPatch
{
[HarmonyPatch("Start")]
[HarmonyPostfix]
private static void StartPatch(ref StartOfRound __instance)
{
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Expected O, but got Unknown
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: 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_00e1: Expected O, but got Unknown
Terminal val = Object.FindObjectOfType<Terminal>();
if (!Object.op_Implicit((Object)(object)val.enemyFiles.Find((TerminalNode node) => node.creatureName == "Mimics")))
{
MimicCreatureID = val.enemyFiles.Count;
MimicFile.creatureFileID = MimicCreatureID;
val.enemyFiles.Add(MimicFile);
TerminalKeyword val2 = val.terminalNodes.allKeywords.First((TerminalKeyword keyword) => keyword.word == "info");
TerminalKeyword val3 = new TerminalKeyword
{
word = "mimics",
isVerb = false,
defaultVerb = val2
};
List<CompatibleNoun> list = val2.compatibleNouns.ToList();
list.Add(new CompatibleNoun
{
noun = val3,
result = MimicFile
});
val2.compatibleNouns = list.ToArray();
List<TerminalKeyword> list2 = val.terminalNodes.allKeywords.ToList();
list2.Add(val3);
val.terminalNodes.allKeywords = list2.ToArray();
}
}
}
[HarmonyPatch(typeof(RoundManager))]
internal class RoundManagerPatch
{
[HarmonyPatch("SetExitIDs")]
[HarmonyPostfix]
private static void SetExitIDsPatch(ref RoundManager __instance, Vector3 mainEntrancePosition)
{
//IL_058c: Unknown result type (might be due to invalid IL or missing references)
//IL_059d: Unknown result type (might be due to invalid IL or missing references)
//IL_05a2: Unknown result type (might be due to invalid IL or missing references)
//IL_05a7: Unknown result type (might be due to invalid IL or missing references)
//IL_05ac: Unknown result type (might be due to invalid IL or missing references)
//IL_027d: 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_029d: Unknown result type (might be due to invalid IL or missing references)
//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
//IL_02de: Unknown result type (might be due to invalid IL or missing references)
//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0302: Unknown result type (might be due to invalid IL or missing references)
//IL_05bb: Unknown result type (might be due to invalid IL or missing references)
//IL_05c0: Unknown result type (might be due to invalid IL or missing references)
//IL_05c2: Unknown result type (might be due to invalid IL or missing references)
//IL_05c4: Unknown result type (might be due to invalid IL or missing references)
//IL_05f9: Unknown result type (might be due to invalid IL or missing references)
//IL_063a: Unknown result type (might be due to invalid IL or missing references)
//IL_0716: Unknown result type (might be due to invalid IL or missing references)
//IL_071b: Unknown result type (might be due to invalid IL or missing references)
//IL_071f: Unknown result type (might be due to invalid IL or missing references)
//IL_072b: Unknown result type (might be due to invalid IL or missing references)
//IL_0730: Unknown result type (might be due to invalid IL or missing references)
//IL_0734: Unknown result type (might be due to invalid IL or missing references)
//IL_0739: Unknown result type (might be due to invalid IL or missing references)
//IL_06d1: Unknown result type (might be due to invalid IL or missing references)
//IL_0385: Unknown result type (might be due to invalid IL or missing references)
//IL_0396: Unknown result type (might be due to invalid IL or missing references)
//IL_039b: Unknown result type (might be due to invalid IL or missing references)
//IL_03a0: Unknown result type (might be due to invalid IL or missing references)
//IL_03a5: Unknown result type (might be due to invalid IL or missing references)
//IL_03af: Unknown result type (might be due to invalid IL or missing references)
//IL_03b4: Unknown result type (might be due to invalid IL or missing references)
//IL_03b9: Unknown result type (might be due to invalid IL or missing references)
//IL_03bf: Unknown result type (might be due to invalid IL or missing references)
//IL_03c7: Unknown result type (might be due to invalid IL or missing references)
//IL_03d0: Unknown result type (might be due to invalid IL or missing references)
//IL_03da: Unknown result type (might be due to invalid IL or missing references)
//IL_045c: Unknown result type (might be due to invalid IL or missing references)
//IL_0464: Unknown result type (might be due to invalid IL or missing references)
//IL_046d: Unknown result type (might be due to invalid IL or missing references)
//IL_0477: Unknown result type (might be due to invalid IL or missing references)
//IL_0829: Unknown result type (might be due to invalid IL or missing references)
//IL_0833: Expected O, but got Unknown
//IL_0931: Unknown result type (might be due to invalid IL or missing references)
//IL_0958: Unknown result type (might be due to invalid IL or missing references)
//IL_08d2: Unknown result type (might be due to invalid IL or missing references)
//IL_08f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0a0c: Unknown result type (might be due to invalid IL or missing references)
//IL_0a33: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)MimicNetworker.Instance == (Object)null)
{
return;
}
MimicsAPI.MainAPI.RefreshMimicEventHandler();
MimicDoor.allMimics = new List<MimicDoor>();
int num = 0;
Dungeon currentDungeon = __instance.dungeonGenerator.Generator.CurrentDungeon;
if (!InteriorWhitelist.Contains(((Object)currentDungeon.DungeonFlow).name.ToLower().Trim()))
{
return;
}
int num2 = 0;
int[] array = new int[6]
{
MimicNetworker.SpawnWeight0.Value,
MimicNetworker.SpawnWeight1.Value,
MimicNetworker.SpawnWeight2.Value,
MimicNetworker.SpawnWeight3.Value,
MimicNetworker.SpawnWeight4.Value,
MimicNetworker.SpawnWeightMax.Value
};
int num3 = 0;
int[] array2 = array;
foreach (int num4 in array2)
{
num3 += num4;
}
Random random = new Random(StartOfRound.Instance.randomMapSeed + 753);
int num5 = random.Next(0, num3);
int num6 = 0;
for (int j = 0; j < array.Length; j++)
{
if (num5 < array[j] + num6)
{
num2 = j;
break;
}
num6 += array[j];
}
if (num2 == 5)
{
num2 = 999;
}
EntranceTeleport[] array3 = Object.FindObjectsOfType<EntranceTeleport>(false);
int num7 = (array3.Length - 2) / 2;
if (MimicNetworker.SpawnRateDynamic.Value && num2 < num7 && num7 > 1)
{
num2 += random.Next(0, 2);
}
if (MimicNetworker.SpawnRateDynamic.Value && currentDungeon.AllTiles.Count > 100)
{
num2 += random.Next(0, 2);
}
if (((NetworkBehaviour)RoundManager.Instance).IsOwner)
{
Debug.Log((object)("I am the host. Desired mimics: " + num2));
}
else
{
Debug.Log((object)("I am the client. Desired mimics: " + num2));
}
List<Doorway> list = new List<Doorway>();
Bounds val2 = default(Bounds);
foreach (Tile allTile in currentDungeon.AllTiles)
{
foreach (Doorway unusedDoorway in allTile.UnusedDoorways)
{
if (!MimicsAPI.MainAPI.IgnoreDefaultPlacementValidation(unusedDoorway))
{
if (unusedDoorway.HasDoorPrefabInstance || (Object)(object)((Component)unusedDoorway).GetComponentInChildren<SpawnSyncedObject>(true) == (Object)null)
{
continue;
}
GameObject gameObject = ((Component)((Component)((Component)unusedDoorway).GetComponentInChildren<SpawnSyncedObject>(true)).transform.parent).gameObject;
if (!((Object)gameObject).name.StartsWith("AlleyExitDoorContainer") || gameObject.activeSelf)
{
continue;
}
bool flag = false;
Matrix4x4 val = Matrix4x4.TRS(((Component)unusedDoorway).transform.position, ((Component)unusedDoorway).transform.rotation, new Vector3(1f, 1f, 1f));
((Bounds)(ref val2))..ctor(new Vector3(0f, 1.5f, 5.5f), new Vector3(2f, 6f, 8f));
((Bounds)(ref val2)).center = ((Matrix4x4)(ref val)).MultiplyPoint3x4(((Bounds)(ref val2)).center);
Collider[] array4 = Physics.OverlapBox(((Bounds)(ref val2)).center, ((Bounds)(ref val2)).extents, ((Component)unusedDoorway).transform.rotation, LayerMask.GetMask(new string[3] { "Room", "Railing", "MapHazards" }));
Collider[] array5 = array4;
int num8 = 0;
if (num8 < array5.Length)
{
Collider val3 = array5[num8];
flag = true;
}
if (flag)
{
continue;
}
foreach (Tile allTile2 in currentDungeon.AllTiles)
{
if (!((Object)(object)allTile == (Object)(object)allTile2))
{
Vector3 origin = ((Component)unusedDoorway).transform.position + 5f * ((Component)unusedDoorway).transform.forward;
Bounds val4 = UnityUtil.CalculateProxyBounds(((Component)allTile2).gameObject, true, Vector3.up);
Ray val5 = default(Ray);
((Ray)(ref val5)).origin = origin;
((Ray)(ref val5)).direction = Vector3.up;
if (((Bounds)(ref val4)).IntersectRay(val5) && (((Object)allTile2).name.Contains("Catwalk") || ((Object)allTile2).name.Contains("LargeForkTile") || ((Object)allTile2).name.Contains("4x4BigStair") || ((Object)allTile2).name.Contains("ElevatorConnector") || (((Object)allTile2).name.Contains("StartRoom") && !((Object)allTile2).name.Contains("Manor"))))
{
flag = true;
}
val5 = default(Ray);
((Ray)(ref val5)).origin = origin;
((Ray)(ref val5)).direction = Vector3.down;
if (((Bounds)(ref val4)).IntersectRay(val5) && (((Object)allTile2).name.Contains("MediumRoomHallway1B") || ((Object)allTile2).name.Contains("LargeForkTile") || ((Object)allTile2).name.Contains("4x4BigStair") || ((Object)allTile2).name.Contains("ElevatorConnector") || ((Object)allTile2).name.Contains("StartRoom")))
{
flag = true;
}
}
}
if (flag)
{
continue;
}
}
if (MimicsAPI.MainAPI.IsPlacementValid(unusedDoorway))
{
list.Add(unusedDoorway);
}
}
}
Shuffle(list, StartOfRound.Instance.randomMapSeed);
List<Vector3> list2 = new List<Vector3>();
foreach (Doorway item in list)
{
if (num >= num2)
{
break;
}
bool flag2 = false;
Vector3 val6 = ((Component)item).transform.position + 5f * ((Component)item).transform.forward;
foreach (Vector3 item2 in list2)
{
if (Vector3.Distance(val6, item2) < 4f)
{
flag2 = true;
break;
}
}
if (flag2)
{
continue;
}
list2.Add(val6);
GameObject gameObject2 = ((Component)((Component)((Component)item).GetComponentInChildren<SpawnSyncedObject>(true)).transform.parent).gameObject;
GameObject val7 = Object.Instantiate<GameObject>(MimicPrefab, ((Component)item).transform);
val7.transform.position = gameObject2.transform.position;
MimicDoor component = val7.GetComponent<MimicDoor>();
component.scanNode.creatureScanID = MimicCreatureID;
AudioSource[] componentsInChildren = val7.GetComponentsInChildren<AudioSource>(true);
foreach (AudioSource val8 in componentsInChildren)
{
val8.volume = MimicVolume / 100f;
val8.outputAudioMixerGroup = StartOfRound.Instance.ship3DAudio.outputAudioMixerGroup;
}
if (SpawnRates[5] == 9753 && num == 0)
{
val7.transform.position = new Vector3(-7f, 0f, -10f);
}
MimicDoor.allMimics.Add(component);
component.mimicIndex = num;
num++;
GameObject gameObject3 = ((Component)((Component)item).transform.GetChild(0)).gameObject;
gameObject3.SetActive(false);
Bounds bounds = ((Collider)component.frameBox).bounds;
Vector3 center = ((Bounds)(ref bounds)).center;
bounds = ((Collider)component.frameBox).bounds;
Collider[] array6 = Physics.OverlapBox(center, ((Bounds)(ref bounds)).extents, Quaternion.identity);
foreach (Collider val9 in array6)
{
if (((Object)((Component)val9).gameObject).name.Contains("Shelf"))
{
((Component)val9).gameObject.SetActive(false);
}
}
Light componentInChildren = gameObject2.GetComponentInChildren<Light>(true);
((Component)componentInChildren).transform.parent.SetParent(val7.transform);
MeshRenderer[] componentsInChildren2 = val7.GetComponentsInChildren<MeshRenderer>();
MeshRenderer[] array7 = componentsInChildren2;
foreach (MeshRenderer val10 in array7)
{
Material[] materials = ((Renderer)val10).materials;
foreach (Material val11 in materials)
{
val11.shader = ((Renderer)gameObject3.GetComponentInChildren<MeshRenderer>(true)).material.shader;
val11.renderQueue = ((Renderer)gameObject3.GetComponentInChildren<MeshRenderer>(true)).material.renderQueue;
}
}
component.interactTrigger.onInteract = new InteractEvent();
((UnityEvent<PlayerControllerB>)(object)component.interactTrigger.onInteract).AddListener((UnityAction<PlayerControllerB>)component.TouchMimic);
MimicsAPI.MainAPI.OnMimicCreated(component, item);
if (MimicsAPI.MainAPI.OverrideDefaultImperfectionCreation(component, item))
{
MimicsAPI.MainAPI.OnMimicCreateImperfections(component);
break;
}
if (MimicPerfection)
{
continue;
}
component.interactTrigger.timeToHold = 0.9f;
if (!ColorBlindMode)
{
if ((StartOfRound.Instance.randomMapSeed + num) % 2 == 0)
{
((Renderer)val7.GetComponentsInChildren<MeshRenderer>()[0]).material.color = new Color(0.490566f, 0.1226415f, 0.1302275f);
((Renderer)val7.GetComponentsInChildren<MeshRenderer>()[1]).material.color = new Color(0.4339623f, 0.1043965f, 0.1150277f);
componentInChildren.colorTemperature = 1250f;
}
else
{
((Renderer)val7.GetComponentsInChildren<MeshRenderer>()[0]).material.color = new Color(0.5f, 0.1580188f, 0.1657038f);
((Renderer)val7.GetComponentsInChildren<MeshRenderer>()[1]).material.color = new Color(43f / 106f, 0.1358579f, 0.1393619f);
componentInChildren.colorTemperature = 1300f;
}
}
else if ((StartOfRound.Instance.randomMapSeed + num) % 2 == 0)
{
component.interactTrigger.timeToHold = 1.1f;
}
else
{
component.interactTrigger.timeToHold = 1f;
}
if (!EasyMode)
{
continue;
}
Random random2 = new Random(StartOfRound.Instance.randomMapSeed + num);
switch (random2.Next(0, 4))
{
case 0:
if (!ColorBlindMode)
{
((Renderer)val7.GetComponentsInChildren<MeshRenderer>()[0]).material.color = new Color(0.489f, 0.2415526f, 0.1479868f);
((Renderer)val7.GetComponentsInChildren<MeshRenderer>()[1]).material.color = new Color(0.489f, 0.2415526f, 0.1479868f);
}
else
{
component.interactTrigger.timeToHold = 1.5f;
}
break;
case 1:
component.interactTrigger.hoverTip = "Feed : [LMB]";
component.interactTrigger.holdTip = "Feed : [LMB]";
break;
case 2:
component.interactTrigger.hoverIcon = component.LostFingersIcon;
break;
case 3:
component.interactTrigger.holdTip = "DIE : [LMB]";
component.interactTrigger.timeToHold = 0.5f;
break;
default:
component.interactTrigger.hoverTip = "BUG, REPORT TO DEVELOPER";
break;
}
}
}
}
[HarmonyPatch(typeof(SprayPaintItem))]
internal class SprayPaintItemPatch
{
private static FieldInfo SprayHit = typeof(SprayPaintItem).GetField("sprayHit", BindingFlags.Instance | BindingFlags.NonPublic);
[HarmonyPatch("SprayPaintClientRpc")]
[HarmonyPostfix]
private static void SprayPaintClientRpcPatch(SprayPaintItem __instance, Vector3 sprayPos, Vector3 sprayRot)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)MimicNetworker.Instance == (Object)null)
{
return;
}
RaycastHit val = (RaycastHit)SprayHit.GetValue(__instance);
if ((Object)(object)((RaycastHit)(ref val)).collider != (Object)null && ((Object)((RaycastHit)(ref val)).collider).name == "MimicSprayCollider")
{
MimicDoor component = ((Component)((Component)((RaycastHit)(ref val)).collider).transform.parent.parent).GetComponent<MimicDoor>();
component.sprayCount++;
if (component.sprayCount > 8)
{
MimicNetworker.Instance.MimicAddAnger(1, component.mimicIndex);
}
}
}
}
[HarmonyPatch(typeof(LockPicker))]
internal class LockPickerPatch
{
private static FieldInfo RayHit = typeof(LockPicker).GetField("hit", BindingFlags.Instance | BindingFlags.NonPublic);
[HarmonyPatch("ItemActivate")]
[HarmonyPostfix]
private static void ItemActivatePatch(LockPicker __instance, bool used, bool buttonDown = true)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: 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)
if ((Object)(object)MimicNetworker.Instance == (Object)null)
{
return;
}
RaycastHit val = (RaycastHit)RayHit.GetValue(__instance);
if (!((Object)(object)((GrabbableObject)__instance).playerHeldBy == (Object)null) && !((object)(RaycastHit)(ref val)).Equals((object)default(RaycastHit)) && !((Object)(object)((RaycastHit)(ref val)).transform.parent == (Object)null))
{
Transform parent = ((RaycastHit)(ref val)).transform.parent;
if (((Object)parent).name.StartsWith("MimicDoor"))
{
MimicNetworker.Instance.MimicLockPick(__instance, ((Component)parent).GetComponent<MimicDoor>().mimicIndex);
}
}
}
}
private const string modGUID = "x753.Mimics";
private const string modName = "Mimics";
private const string modVersion = "2.6.4";
private readonly Harmony harmony = new Harmony("x753.Mimics");
internal static ManualLogSource MimicsLogger;
private static Mimics Instance;
public static GameObject MimicPrefab;
public static GameObject MimicNetworkerPrefab;
public static TerminalNode MimicFile;
public static int MimicCreatureID;
public static int[] SpawnRates;
public static bool MimicPerfection;
public static bool UpgradeCompatibility;
public static bool EasyMode;
public static bool ColorBlindMode;
public static float MimicVolume;
public static bool DynamicSpawnRate;
public static List<string> InteriorWhitelist;
private void Awake()
{
AssetBundle val = AssetBundle.LoadFromMemory(Resources.mimicdoor);
MimicPrefab = val.LoadAsset<GameObject>("Assets/MimicDoor.prefab");
MimicNetworkerPrefab = val.LoadAsset<GameObject>("Assets/MimicNetworker.prefab");
MimicFile = val.LoadAsset<TerminalNode>("Assets/MimicFile.asset");
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
harmony.PatchAll();
MimicsLogger = Logger.CreateLogSource("x753.Mimics");
MimicsLogger.LogInfo((object)"Plugin Mimics is loaded!!");
string value = ((BaseUnityPlugin)this).Config.Bind<string>("Compatibility", "Interiors Whitelist", "Level1Flow, Level1Flow3Exits, Level1FlowExtraLarge, Level2Flow, SDMLevel, OfficeDungeonFlow, TranquillityManorFlow", "Comma separated list of interiors that mimics can spawn in. Not all interiors will work.").Value;
InteriorWhitelist = (from s in value.ToLower().Split(',')
select s.Trim()).ToList();
SpawnRates = new int[6]
{
((BaseUnityPlugin)this).Config.Bind<int>("Spawn Rate", "Zero Mimics", 23, "Weight of zero mimics spawning").Value,
((BaseUnityPlugin)this).Config.Bind<int>("Spawn Rate", "One Mimic", 69, "Weight of one mimic spawning").Value,
((BaseUnityPlugin)this).Config.Bind<int>("Spawn Rate", "Two Mimics", 7, "Weight of two mimics spawning").Value,
((BaseUnityPlugin)this).Config.Bind<int>("Spawn Rate", "Three Mimics", 1, "Weight of three mimics spawning").Value,
((BaseUnityPlugin)this).Config.Bind<int>("Spawn Rate", "Four Mimics", 0, "Weight of four mimics spawning").Value,
((BaseUnityPlugin)this).Config.Bind<int>("Spawn Rate", "Maximum Mimics", 0, "Weight of maximum mimics spawning").Value
};
DynamicSpawnRate = ((BaseUnityPlugin)this).Config.Bind<bool>("Spawn Rate", "Dynamic Spawn Rate", true, "Increases mimic spawn rate based on dungeon size and the number of instances of the real thing.").Value;
MimicPerfection = ((BaseUnityPlugin)this).Config.Bind<bool>("Difficulty", "Perfect Mimics", false, "Select this if you want mimics to be the exact same color as the real thing. Overrides all difficulty settings.").Value;
UpgradeCompatibility = ((BaseUnityPlugin)this).Config.Bind<bool>("Difficulty", "Upgrade Compatibility", false, "Mimics won't instantly attack when struck with a powerful blow, such as an upgraded shovel.").Value;
EasyMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Difficulty", "Easy Mode", false, "Each mimic will have one of several possible imperfections to help you tell if it's a mimic.").Value;
ColorBlindMode = ((BaseUnityPlugin)this).Config.Bind<bool>("Difficulty", "Color Blind Mode", false, "Replaces all color differences with another way to differentiate mimics.").Value;
MimicVolume = ((BaseUnityPlugin)this).Config.Bind<int>("General", "SFX Volume", 100, "Volume of the mimic's SFX (0-100)").Value;
if (MimicVolume < 0f)
{
MimicVolume = 0f;
}
if (MimicVolume > 100f)
{
MimicVolume = 100f;
}
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);
}
}
}
}
public static void Shuffle<T>(IList<T> list, int seed)
{
Random random = new Random(seed);
int num = list.Count;
while (num > 1)
{
num--;
int index = random.Next(num + 1);
T value = list[index];
list[index] = list[num];
list[num] = value;
}
}
}
public class MimicNetworker : NetworkBehaviour
{
public static MimicNetworker Instance;
public static NetworkVariable<int> SpawnWeight0 = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);
public static NetworkVariable<int> SpawnWeight1 = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);
public static NetworkVariable<int> SpawnWeight2 = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);
public static NetworkVariable<int> SpawnWeight3 = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);
public static NetworkVariable<int> SpawnWeight4 = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);
public static NetworkVariable<int> SpawnWeightMax = new NetworkVariable<int>(0, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);
public static NetworkVariable<bool> SpawnRateDynamic = new NetworkVariable<bool>(false, (NetworkVariableReadPermission)0, (NetworkVariableWritePermission)0);
private void Awake()
{
Instance = this;
}
public void MimicAttack(int playerId, int mimicIndex, bool ownerOnly = false)
{
if (((NetworkBehaviour)this).IsOwner)
{
Instance.MimicAttackClientRpc(playerId, mimicIndex);
}
else if (!ownerOnly)
{
Instance.MimicAttackServerRpc(playerId, mimicIndex);
}
}
[ClientRpc]
public void MimicAttackClientRpc(int playerId, int mimicIndex)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2885019175u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerId);
BytePacker.WriteValueBitPacked(val2, mimicIndex);
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2885019175u, val, (RpcDelivery)0);
}
if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
{
((MonoBehaviour)this).StartCoroutine(MimicDoor.allMimics[mimicIndex].Attack(playerId));
}
}
}
[ServerRpc(RequireOwnership = false)]
public void MimicAttackServerRpc(int playerId, int mimicIndex)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1024971481u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerId);
BytePacker.WriteValueBitPacked(val2, mimicIndex);
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1024971481u, val, (RpcDelivery)0);
}
if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
Instance.MimicAttackClientRpc(playerId, mimicIndex);
}
}
}
public void MimicAddAnger(int amount, int mimicIndex)
{
if (((NetworkBehaviour)this).IsOwner)
{
Instance.MimicAddAngerClientRpc(amount, mimicIndex);
}
else
{
Instance.MimicAddAngerServerRpc(amount, mimicIndex);
}
}
[ClientRpc]
public void MimicAddAngerClientRpc(int amount, int mimicIndex)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1137632670u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, amount);
BytePacker.WriteValueBitPacked(val2, mimicIndex);
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1137632670u, val, (RpcDelivery)0);
}
if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
{
((MonoBehaviour)this).StartCoroutine(MimicDoor.allMimics[mimicIndex].AddAnger(amount));
}
}
}
[ServerRpc(RequireOwnership = false)]
public void MimicAddAngerServerRpc(int amount, int mimicIndex)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(669208889u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, amount);
BytePacker.WriteValueBitPacked(val2, mimicIndex);
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 669208889u, val, (RpcDelivery)0);
}
if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
Instance.MimicAddAngerClientRpc(amount, mimicIndex);
}
}
}
public void MimicLockPick(LockPicker lockPicker, int mimicIndex, bool ownerOnly = false)
{
int playerId = (int)((GrabbableObject)lockPicker).playerHeldBy.playerClientId;
if (((NetworkBehaviour)this).IsOwner)
{
Instance.MimicLockPickClientRpc(playerId, mimicIndex);
}
else if (!ownerOnly)
{
Instance.MimicLockPickServerRpc(playerId, mimicIndex);
}
}
[ClientRpc]
public void MimicLockPickClientRpc(int playerId, int mimicIndex)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3716888238u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerId);
BytePacker.WriteValueBitPacked(val2, mimicIndex);
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3716888238u, val, (RpcDelivery)0);
}
if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
{
((MonoBehaviour)this).StartCoroutine(MimicDoor.allMimics[mimicIndex].MimicLockPick(playerId));
}
}
}
[ServerRpc(RequireOwnership = false)]
public void MimicLockPickServerRpc(int playerId, int mimicIndex)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Invalid comparison between Unknown and I4
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00b0: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1897916243u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerId);
BytePacker.WriteValueBitPacked(val2, mimicIndex);
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1897916243u, val, (RpcDelivery)0);
}
if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
Instance.MimicLockPickClientRpc(playerId, mimicIndex);
}
}
}
protected override void __initializeVariables()
{
if (SpawnWeight0 == null)
{
throw new Exception("MimicNetworker.SpawnWeight0 cannot be null. All NetworkVariableBase instances must be initialized.");
}
((NetworkVariableBase)SpawnWeight0).Initialize((NetworkBehaviour)(object)this);
((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SpawnWeight0, "SpawnWeight0");
base.NetworkVariableFields.Add((NetworkVariableBase)(object)SpawnWeight0);
if (SpawnWeight1 == null)
{
throw new Exception("MimicNetworker.SpawnWeight1 cannot be null. All NetworkVariableBase instances must be initialized.");
}
((NetworkVariableBase)SpawnWeight1).Initialize((NetworkBehaviour)(object)this);
((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SpawnWeight1, "SpawnWeight1");
base.NetworkVariableFields.Add((NetworkVariableBase)(object)SpawnWeight1);
if (SpawnWeight2 == null)
{
throw new Exception("MimicNetworker.SpawnWeight2 cannot be null. All NetworkVariableBase instances must be initialized.");
}
((NetworkVariableBase)SpawnWeight2).Initialize((NetworkBehaviour)(object)this);
((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SpawnWeight2, "SpawnWeight2");
base.NetworkVariableFields.Add((NetworkVariableBase)(object)SpawnWeight2);
if (SpawnWeight3 == null)
{
throw new Exception("MimicNetworker.SpawnWeight3 cannot be null. All NetworkVariableBase instances must be initialized.");
}
((NetworkVariableBase)SpawnWeight3).Initialize((NetworkBehaviour)(object)this);
((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SpawnWeight3, "SpawnWeight3");
base.NetworkVariableFields.Add((NetworkVariableBase)(object)SpawnWeight3);
if (SpawnWeight4 == null)
{
throw new Exception("MimicNetworker.SpawnWeight4 cannot be null. All NetworkVariableBase instances must be initialized.");
}
((NetworkVariableBase)SpawnWeight4).Initialize((NetworkBehaviour)(object)this);
((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SpawnWeight4, "SpawnWeight4");
base.NetworkVariableFields.Add((NetworkVariableBase)(object)SpawnWeight4);
if (SpawnWeightMax == null)
{
throw new Exception("MimicNetworker.SpawnWeightMax cannot be null. All NetworkVariableBase instances must be initialized.");
}
((NetworkVariableBase)SpawnWeightMax).Initialize((NetworkBehaviour)(object)this);
((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SpawnWeightMax, "SpawnWeightMax");
base.NetworkVariableFields.Add((NetworkVariableBase)(object)SpawnWeightMax);
if (SpawnRateDynamic == null)
{
throw new Exception("MimicNetworker.SpawnRateDynamic cannot be null. All NetworkVariableBase instances must be initialized.");
}
((NetworkVariableBase)SpawnRateDynamic).Initialize((NetworkBehaviour)(object)this);
((NetworkBehaviour)this).__nameNetworkVariable((NetworkVariableBase)(object)SpawnRateDynamic, "SpawnRateDynamic");
base.NetworkVariableFields.Add((NetworkVariableBase)(object)SpawnRateDynamic);
((NetworkBehaviour)this).__initializeVariables();
}
[RuntimeInitializeOnLoadMethod]
internal static void InitializeRPCS_MimicNetworker()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Expected O, but got Unknown
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Expected O, but got Unknown
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Expected O, but got Unknown
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Expected O, but got Unknown
NetworkManager.__rpc_func_table.Add(2885019175u, new RpcReceiveHandler(__rpc_handler_2885019175));
NetworkManager.__rpc_func_table.Add(1024971481u, new RpcReceiveHandler(__rpc_handler_1024971481));
NetworkManager.__rpc_func_table.Add(1137632670u, new RpcReceiveHandler(__rpc_handler_1137632670));
NetworkManager.__rpc_func_table.Add(669208889u, new RpcReceiveHandler(__rpc_handler_669208889));
NetworkManager.__rpc_func_table.Add(3716888238u, new RpcReceiveHandler(__rpc_handler_3716888238));
NetworkManager.__rpc_func_table.Add(1897916243u, new RpcReceiveHandler(__rpc_handler_1897916243));
}
private static void __rpc_handler_2885019175(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int playerId = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
int mimicIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)2;
((MimicNetworker)(object)target).MimicAttackClientRpc(playerId, mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_1024971481(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int playerId = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
int mimicIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)1;
((MimicNetworker)(object)target).MimicAttackServerRpc(playerId, mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_1137632670(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int amount = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref amount);
int mimicIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)2;
((MimicNetworker)(object)target).MimicAddAngerClientRpc(amount, mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_669208889(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int amount = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref amount);
int mimicIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)1;
((MimicNetworker)(object)target).MimicAddAngerServerRpc(amount, mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_3716888238(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int playerId = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
int mimicIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)2;
((MimicNetworker)(object)target).MimicLockPickClientRpc(playerId, mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_1897916243(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
int playerId = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref playerId);
int mimicIndex = default(int);
ByteUnpacker.ReadValueBitPacked(reader, ref mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)1;
((MimicNetworker)(object)target).MimicLockPickServerRpc(playerId, mimicIndex);
target.__rpc_exec_stage = (__RpcExecStage)0;
}
}
protected internal override string __getTypeName()
{
return "MimicNetworker";
}
}
public class MimicDoor : MonoBehaviour
{
public GameObject playerTarget;
public BoxCollider frameBox;
public Sprite LostFingersIcon;
public Animator mimicAnimator;
public GameObject grabPoint;
public InteractTrigger interactTrigger;
public ScanNodeProperties scanNode;
public int anger;
public bool angering;
public int sprayCount;
private bool attacking;
public static List<MimicDoor> allMimics;
public int mimicIndex;
private static MethodInfo RetractClaws = typeof(LockPicker).GetMethod("RetractClaws", BindingFlags.Instance | BindingFlags.NonPublic);
public void TouchMimic(PlayerControllerB player)
{
if (!attacking)
{
MimicNetworker.Instance.MimicAttack((int)player.playerClientId, mimicIndex);
}
}
public IEnumerator Attack(int playerId)
{
PlayerControllerB player = StartOfRound.Instance.allPlayerScripts[playerId];
MimicsAPI.MainAPI.OnMimicAttackStart(this, player);
attacking = true;
interactTrigger.interactable = false;
mimicAnimator.SetTrigger("Attack");
playerTarget.transform.position = ((Component)player).transform.position;
yield return (object)new WaitForSeconds(0.1f);
playerTarget.transform.position = ((Component)player).transform.position;
yield return (object)new WaitForSeconds(0.1f);
playerTarget.transform.position = ((Component)player).transform.position;
yield return (object)new WaitForSeconds(0.1f);
playerTarget.transform.position = ((Component)player).transform.position;
yield return (object)new WaitForSeconds(0.1f);
float num = Vector3.Distance(((Component)GameNetworkManager.Instance.localPlayerController).transform.position, ((Component)frameBox).transform.position);
if (num < 8f)
{
HUDManager.Instance.ShakeCamera((ScreenShakeType)1);
}
else if (num < 14f)
{
HUDManager.Instance.ShakeCamera((ScreenShakeType)0);
}
yield return (object)new WaitForSeconds(0.2f);
if (((NetworkBehaviour)player).IsOwner && Vector3.Distance(((Component)player).transform.position, ((Component)this).transform.position) < 8.45f)
{
player.KillPlayer(Vector3.zero, true, (CauseOfDeath)0, 0, default(Vector3));
}
float startTime = Time.timeSinceLevelLoad;
yield return (object)new WaitUntil((Func<bool>)(() => (Object)(object)player.deadBody != (Object)null || Time.timeSinceLevelLoad - startTime > 4f));
if ((Object)(object)player.deadBody != (Object)null)
{
player.deadBody.attachedTo = grabPoint.transform;
player.deadBody.attachedLimb = player.deadBody.bodyParts[5];
player.deadBody.matchPositionExactly = true;
for (int i = 0; i < player.deadBody.bodyParts.Length; i++)
{
((Component)player.deadBody.bodyParts[i]).GetComponent<Collider>().excludeLayers = LayerMask.op_Implicit(-1);
}
}
yield return (object)new WaitForSeconds(2f);
if ((Object)(object)player.deadBody != (Object)null)
{
player.deadBody.attachedTo = null;
player.deadBody.attachedLimb = null;
player.deadBody.matchPositionExactly = false;
((Component)((Component)player.deadBody).transform.GetChild(0)).gameObject.SetActive(false);
player.deadBody = null;
}
yield return (object)new WaitForSeconds(4.5f);
attacking = false;
interactTrigger.interactable = true;
MimicsAPI.MainAPI.OnMimicAttackEnd(this);
}
public IEnumerator MimicLockPick(int playerId)
{
if (angering || attacking)
{
yield break;
}
LockPicker lockPicker = default(LockPicker);
ref LockPicker reference = ref lockPicker;
GrabbableObject currentlyHeldObjectServer = StartOfRound.Instance.allPlayerScripts[playerId].currentlyHeldObjectServer;
reference = (LockPicker)(object)((currentlyHeldObjectServer is LockPicker) ? currentlyHeldObjectServer : null);
if ((Object)(object)lockPicker == (Object)null)
{
yield break;
}
attacking = true;
interactTrigger.interactable = false;
AudioSource component = ((Component)lockPicker).GetComponent<AudioSource>();
component.PlayOneShot(lockPicker.placeLockPickerClips[Random.Range(0, lockPicker.placeLockPickerClips.Length)]);
lockPicker.armsAnimator.SetBool("mounted", true);
lockPicker.armsAnimator.SetBool("picking", true);
component.Play();
component.pitch = Random.Range(0.94f, 1.06f);
lockPicker.isOnDoor = true;
lockPicker.isPickingLock = true;
((GrabbableObject)lockPicker).grabbable = false;
if (((NetworkBehaviour)lockPicker).IsOwner)
{
((GrabbableObject)lockPicker).playerHeldBy.DiscardHeldObject(true, ((NetworkBehaviour)MimicNetworker.Instance).NetworkObject, ((Component)this).transform.position + ((Component)this).transform.up * 1.5f - ((Component)this).transform.forward * 1.15f, true);
}
float startTime = Time.timeSinceLevelLoad;
yield return (object)new WaitUntil((Func<bool>)(() => !((GrabbableObject)lockPicker).isHeld || Time.timeSinceLevelLoad - startTime > 10f));
((Component)lockPicker).transform.localEulerAngles = new Vector3(((Component)this).transform.eulerAngles.x, ((Component)this).transform.eulerAngles.y + 90f, ((Component)this).transform.eulerAngles.z);
yield return (object)new WaitForSeconds(5f);
RetractClaws.Invoke(lockPicker, null);
((Component)lockPicker).transform.SetParent((Transform)null);
((GrabbableObject)lockPicker).startFallingPosition = ((Component)lockPicker).transform.position;
((GrabbableObject)lockPicker).FallToGround(false);
((GrabbableObject)lockPicker).grabbable = true;
yield return (object)new WaitForSeconds(1f);
anger = 3;
attacking = false;
interactTrigger.interactable = false;
PlayerControllerB val = null;
float num = 9999f;
PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
foreach (PlayerControllerB val2 in allPlayerScripts)
{
float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position);
if (num2 < num)
{
num = num2;
val = val2;
}
}
if ((Object)(object)val != (Object)null)
{
MimicNetworker.Instance.MimicAttackClientRpc((int)val.playerClientId, mimicIndex);
}
else
{
interactTrigger.interactable = true;
}
}
public IEnumerator AddAnger(int amount)
{
if (angering || attacking)
{
yield break;
}
angering = true;
anger += amount;
if (anger == 1)
{
Sprite oldIcon2 = interactTrigger.hoverIcon;
interactTrigger.hoverIcon = LostFingersIcon;
mimicAnimator.SetTrigger("Growl");
yield return (object)new WaitForSeconds(2.75f);
interactTrigger.hoverIcon = oldIcon2;
sprayCount = 0;
angering = false;
yield break;
}
if (anger == 2)
{
interactTrigger.holdTip = "DIE : [LMB]";
interactTrigger.timeToHold = 0.25f;
Sprite oldIcon2 = interactTrigger.hoverIcon;
interactTrigger.hoverIcon = LostFingersIcon;
mimicAnimator.SetTrigger("Growl");
yield return (object)new WaitForSeconds(2.75f);
interactTrigger.hoverIcon = oldIcon2;
sprayCount = 0;
angering = false;
yield break;
}
if (anger > 2)
{
PlayerControllerB val = null;
float num = 9999f;
PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts;
foreach (PlayerControllerB val2 in allPlayerScripts)
{
float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position);
if (num2 < num)
{
num = num2;
val = val2;
}
}
if ((Object)(object)val != (Object)null)
{
MimicNetworker.Instance.MimicAttackClientRpc((int)val.playerClientId, mimicIndex);
}
}
sprayCount = 0;
angering = false;
}
}
public class MimicCollider : MonoBehaviour, IHittable
{
public MimicDoor mimic;
bool IHittable.Hit(int force, Vector3 hitDirection, PlayerControllerB playerWhoHit = null, bool playHitSFX = false, int hitID = -1)
{
if (Mimics.UpgradeCompatibility)
{
force = 1;
}
MimicNetworker.Instance.MimicAddAnger(force, mimic.mimicIndex);
return true;
}
}
public class MimicListener : MonoBehaviour, INoiseListener
{
public MimicDoor mimic;
private int tolerance = 100;
void INoiseListener.DetectNoise(Vector3 noisePosition, float noiseLoudness, int timesPlayedInOneSpot, int noiseID)
{
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
if ((noiseLoudness >= 0.9f || noiseID == 101158) && Vector3.Distance(noisePosition, ((Component)mimic).transform.position) < 5f)
{
switch (noiseID)
{
case 75:
tolerance--;
break;
case 5:
tolerance -= 15;
break;
case 101158:
tolerance -= 35;
break;
default:
tolerance -= 30;
break;
}
if (tolerance <= 0)
{
tolerance = 100;
MimicNetworker.Instance.MimicAddAnger(1, mimic.mimicIndex);
}
}
}
}
}
namespace Mimics.API
{
public static class MimicsAPI
{
private static MainMimicsAPI _API;
internal static MainMimicsAPI MainAPI
{
get
{
if (_API == null)
{
_API = new MainMimicsAPI();
}
return _API;
}
}
public static IMimicsAPI GetAPI()
{
return MainAPI;
}
}
public interface IMimicsAPI
{
void RegisterMimicEventHandler(MimicEventHandler handler);
MimicEventHandler GetCurrentMimicEventHandler();
}
internal class MainMimicsAPI : IMimicsAPI
{
internal List<MimicEventHandler> mimicEventHandlers = new List<MimicEventHandler>();
internal MimicEventHandler _currentMimicEventHandler;
public void RegisterMimicEventHandler(MimicEventHandler handler)
{
Mimics.MimicsLogger.LogInfo((object)("Registered handler for " + handler.ModGUID));
mimicEventHandlers.Add(handler);
}
public MimicEventHandler GetCurrentMimicEventHandler()
{
return _currentMimicEventHandler;
}
internal void RefreshMimicEventHandler()
{
_currentMimicEventHandler = null;
foreach (MimicEventHandler mimicEventHandler in mimicEventHandlers)
{
try
{
if (mimicEventHandler.IsMyInteriorLoaded && (_currentMimicEventHandler == null || mimicEventHandler.Priority > _currentMimicEventHandler.Priority))
{
_currentMimicEventHandler = mimicEventHandler;
}
}
catch (Exception ex)
{
string text = ((_currentMimicEventHandler != null) ? _currentMimicEventHandler.ModGUID : "NULL");
Mimics.MimicsLogger.LogError((object)("Error with IsMyInteriorLoaded/Priority function for handler " + mimicEventHandler.ModGUID + " or " + text));
Mimics.MimicsLogger.LogError((object)ex.ToString());
}
}
}
internal bool IgnoreDefaultPlacementValidation(Doorway doorway)
{
try
{
if (_currentMimicEventHandler == null)
{
return false;
}
return _currentMimicEventHandler.IgnoreDefaultPlacementValidation(doorway);
}
catch (Exception ex)
{
Mimics.MimicsLogger.LogError((object)("Error with IgnoreDefaultPlacementValidation function for handler " + _currentMimicEventHandler.ModGUID));
Mimics.MimicsLogger.LogError((object)ex.ToString());
}
return false;
}
internal bool IsPlacementValid(Doorway doorway)
{
try
{
if (_currentMimicEventHandler == null)
{
return true;
}
return _currentMimicEventHandler.IsPlacementValid(doorway);
}
catch (Exception ex)
{
Mimics.MimicsLogger.LogError((object)("Error with IsPlacementValid function for handler " + _currentMimicEventHandler.ModGUID));
Mimics.MimicsLogger.LogError((object)ex.ToString());
}
return true;
}
internal bool OverrideDefaultImperfectionCreation(MimicDoor mimicDoor, Doorway doorway)
{
try
{
if (_currentMimicEventHandler == null)
{
return false;
}
return _currentMimicEventHandler.OverrideDefaultImperfectionCreation(mimicDoor, doorway);
}
catch (Exception ex)
{
Mimics.MimicsLogger.LogError((object)("Error with OverrideDefaultImperfectionCreation function for handler " + _currentMimicEventHandler.ModGUID));
Mimics.MimicsLogger.LogError((object)ex.ToString());
}
return false;
}
internal void OnMimicCreated(MimicDoor mimicDoor, Doorway doorway)
{
try
{
_currentMimicEventHandler?.OnMimicCreated(mimicDoor, doorway);
}
catch (Exception ex)
{
Mimics.MimicsLogger.LogError((object)("Error with OnMimicCreated function for handler " + _currentMimicEventHandler.ModGUID));
Mimics.MimicsLogger.LogError((object)ex.ToString());
}
}
internal void OnMimicCreateImperfections(MimicDoor mimicDoor)
{
try
{
_currentMimicEventHandler?.OnMimicCreateImperfections(mimicDoor);
}
catch (Exception ex)
{
Mimics.MimicsLogger.LogError((object)("Error with OnMimicCreateImperfections function for handler " + _currentMimicEventHandler.ModGUID));
Mimics.MimicsLogger.LogError((object)ex.ToString());
}
}
internal void OnMimicAttackStart(MimicDoor mimicDoor, PlayerControllerB playerToAttack)
{
try
{
_currentMimicEventHandler?.OnMimicAttackStart(mimicDoor, playerToAttack);
}
catch (Exception ex)
{
Mimics.MimicsLogger.LogError((object)("Error with OnMimicAttackStart function for handler " + _currentMimicEventHandler.ModGUID));
Mimics.MimicsLogger.LogError((object)ex.ToString());
}
}
internal void OnMimicAttackEnd(MimicDoor mimicDoor)
{
try
{
_currentMimicEventHandler?.OnMimicAttackEnd(mimicDoor);
}
catch (Exception ex)
{
Mimics.MimicsLogger.LogError((object)("Error with OnMimicAttackEnd function for handler " + _currentMimicEventHandler.ModGUID));
Mimics.MimicsLogger.LogError((object)ex.ToString());
}
}
}
public abstract class MimicEventHandler
{
public abstract string ModGUID { get; }
public virtual bool IsMyInteriorLoaded => false;
public virtual int Priority => 0;
public virtual bool IsPlacementValid(Doorway doorway)
{
return true;
}
public virtual bool IgnoreDefaultPlacementValidation(Doorway doorway)
{
return false;
}
public virtual bool OverrideDefaultImperfectionCreation(MimicDoor mimicDoor, Doorway doorway)
{
return false;
}
public virtual void OnMimicCreated(MimicDoor mimicDoor, Doorway doorway)
{
}
public virtual void OnMimicCreateImperfections(MimicDoor mimicDoor)
{
}
public virtual void OnMimicAttackStart(MimicDoor mimicDoor, PlayerControllerB playerToAttack)
{
}
public virtual void OnMimicAttackEnd(MimicDoor mimicDoor)
{
}
}
}
namespace Mimics.NetcodePatcher
{
[AttributeUsage(AttributeTargets.Module)]
internal class NetcodePatchedAssemblyAttribute : Attribute
{
}
}