using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalLib;
using LethalLib.Modules;
using Microsoft.CodeAnalysis;
using Scopophobia;
using Scopophobia.NetcodePatcher;
using Scopophobia.Patches;
using Unity.Collections;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.AI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyCompany("Scopophobia")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Adds the Shy Guy (SCP-096) to Lethal Company. Fully custom animations and behavior. Model from SCP: Containment Breach.")]
[assembly: AssemblyFileVersion("1.1.5")]
[assembly: AssemblyInformationalVersion("1.1.5")]
[assembly: AssemblyProduct("Scopophobia")]
[assembly: AssemblyTitle("Scopophobia")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.5.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
[module: NetcodePatchedAssembly]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
}
[HarmonyPatch(typeof(RoundManager))]
internal class ShyGuySpawnSettings
{
public static string[] InsideOnly = new string[6] { "Level1Experimentation", "Level2Assurance", "Level3Vow", "Level4March", "Level7Offense", "Level6Adamance" };
[HarmonyPatch("BeginEnemySpawning")]
[HarmonyPrefix]
public static void UpdateSpawnRates(ref SelectableLevel ___currentLevel)
{
//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_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Expected O, but got Unknown
if (Config.DisableSpawnRates)
{
ScopophobiaPlugin.logger.LogInfo((object)"Scopophobia Spawn Settings are disabled in config. Ignoring...");
}
else
{
if (!Config.appears || ScopophobiaPlugin.shyPrefab == null)
{
return;
}
try
{
SpawnableEnemyWithRarity shyPrefab = ScopophobiaPlugin.shyPrefab;
List<SpawnableEnemyWithRarity> enemies = ___currentLevel.Enemies;
for (int i = 0; i < ___currentLevel.Enemies.Count; i++)
{
SpawnableEnemyWithRarity val = ___currentLevel.Enemies[i];
if (val.enemyType.enemyName.ToLower() == "shy guy")
{
enemies.Remove(val);
}
}
___currentLevel.Enemies = enemies;
shyPrefab.enemyType.PowerLevel = Config.ShyGuyPowerLevel;
shyPrefab.rarity = Config.spawnRarity;
shyPrefab.enemyType.probabilityCurve = new AnimationCurve((Keyframe[])(object)new Keyframe[3]
{
new Keyframe(0f, Config.startEnemySpawnCurve),
new Keyframe(0.5f, Config.midEnemySpawnCurve),
new Keyframe(1f, Config.endEnemySpawnCurve)
});
shyPrefab.enemyType.MaxCount = Config.maxSpawnCount;
shyPrefab.enemyType.isOutsideEnemy = Config.canSpawnOutside;
if (Config.canSpawnOutside & (!Config.spawnOutsideHardPlanets || !InsideOnly.Contains(___currentLevel.sceneName)))
{
___currentLevel.OutsideEnemies.Add(shyPrefab);
SelectableLevel val2 = ___currentLevel;
val2.maxOutsideEnemyPowerCount += shyPrefab.enemyType.MaxCount * (int)shyPrefab.enemyType.PowerLevel;
}
___currentLevel.Enemies.Add(shyPrefab);
}
catch
{
}
}
}
}
[Serializable]
public class SyncedInstance<T>
{
[NonSerialized]
protected static int IntSize = 4;
internal static CustomMessagingManager MessageManager => NetworkManager.Singleton.CustomMessagingManager;
internal static bool IsClient => NetworkManager.Singleton.IsClient;
internal static bool IsHost => NetworkManager.Singleton.IsHost;
public static T Default { get; private set; }
public static T Instance { get; private set; }
public static bool Synced { get; internal set; }
protected void InitInstance(T instance)
{
Default = instance;
Instance = instance;
IntSize = 4;
}
internal static void SyncInstance(byte[] data)
{
Instance = DeserializeFromBytes(data);
Synced = true;
}
internal static void RevertSync()
{
Instance = Default;
Synced = false;
}
public static byte[] SerializeToBytes(T val)
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
using MemoryStream memoryStream = new MemoryStream();
try
{
binaryFormatter.Serialize(memoryStream, val);
return memoryStream.ToArray();
}
catch (Exception arg)
{
Plugin.logger.LogError((object)$"Error serializing instance: {arg}");
return null;
}
}
public static T DeserializeFromBytes(byte[] data)
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
using MemoryStream serializationStream = new MemoryStream(data);
try
{
return (T)binaryFormatter.Deserialize(serializationStream);
}
catch (Exception arg)
{
Plugin.logger.LogError((object)$"Error deserializing instance: {arg}");
return default(T);
}
}
}
namespace scopophobia
{
public static class PluginInfo
{
public const string PLUGIN_GUID = "Scopophobia";
public const string PLUGIN_NAME = "Scopophobia";
public const string PLUGIN_VERSION = "1.1.14";
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute([In] int obj0)
{
Version = obj0;
}
}
}
namespace ShyGuy.AI
{
public class ShyGuyAI : EnemyAI
{
[CompilerGenerated]
private static class <>O
{
public static RpcReceiveHandler <0>____rpc_handler_2556963367;
public static RpcReceiveHandler <1>____rpc_handler_2298532976;
public static RpcReceiveHandler <2>____rpc_handler_652446748;
public static RpcReceiveHandler <3>____rpc_handler_2536632143;
public static RpcReceiveHandler <4>____rpc_handler_1207108010;
public static RpcReceiveHandler <5>____rpc_handler_1413965488;
}
private Transform localPlayerCamera;
private Vector3 mainEntrancePosition;
public Collider mainCollider;
public AudioSource farAudio;
public AudioSource footstepSource;
public AudioClip screamSFX;
public AudioClip panicSFX;
public AudioClip crySFX;
public AudioClip crySittingSFX;
public AudioClip killPlayerSFX;
[Header("Containment Breach Sounds")]
public AudioClip screamSFX_CB;
public AudioClip panicSFX_CB;
public AudioClip crySFX_CB;
public AudioClip killPlayerSFX_CB;
[Header("Alpha Containment Breach Sounds")]
public AudioClip screamSFX_ACB;
public AudioClip panicSFX_ACB;
public AudioClip crySFX_ACB;
public AudioClip killPlayerSFX_ACB;
[Header("Secret Laboratory Sounds")]
public AudioClip screamSFX_SL;
public AudioClip panicSFX_SL;
public AudioClip crySFX_SL;
public AudioClip killPlayerSFX_SL;
public Material bloodyMaterial;
public AISearchRoutine roamMap;
public Transform shyGuyFace;
private Vector3 spawnPosition;
private Vector3 previousPosition;
private int previousState = -1;
private float roamWaitTime = 40f;
private bool roamShouldSit;
private bool sitting;
private float lastRunSpeed;
private float seeFaceTime;
private float triggerTime;
private float triggerDuration = 66.4f;
private float timeToTrigger = 0.5f;
private float lastInterval = Time.realtimeSinceStartup;
private bool inKillAnimation;
private bool isInElevatorStartRoom;
private float timeAtLastUsingEntrance;
private MineshaftElevatorController elevatorScript;
public List<PlayerControllerB> SCP096Targets = new List<PlayerControllerB>();
public override void Start()
{
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Expected O, but got Unknown
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_00f9: Expected O, but got Unknown
//IL_030e: Unknown result type (might be due to invalid IL or missing references)
//IL_0313: Unknown result type (might be due to invalid IL or missing references)
//IL_031f: Unknown result type (might be due to invalid IL or missing references)
//IL_0342: Unknown result type (might be due to invalid IL or missing references)
//IL_0349: Unknown result type (might be due to invalid IL or missing references)
//IL_034f: Unknown result type (might be due to invalid IL or missing references)
//IL_0357: Unknown result type (might be due to invalid IL or missing references)
//IL_035c: Unknown result type (might be due to invalid IL or missing references)
//IL_040d: Unknown result type (might be due to invalid IL or missing references)
//IL_0417: Expected O, but got Unknown
((EnemyAI)this).Start();
triggerDuration = Config.triggerTime;
Transform val = null;
Queue<Transform> queue = new Queue<Transform>();
queue.Enqueue(((Component)this).transform);
while (queue.Count > 0)
{
Transform val2 = queue.Dequeue();
if (((Object)val2).name == "lefteye")
{
val = val2;
break;
}
foreach (Transform item3 in val2)
{
Transform item = item3;
queue.Enqueue(item);
}
}
Transform val3 = null;
queue = new Queue<Transform>();
queue.Enqueue(((Component)this).transform);
while (queue.Count > 0)
{
Transform val4 = queue.Dequeue();
if (((Object)val4).name == "righteye")
{
val3 = val4;
break;
}
foreach (Transform item4 in val4)
{
Transform item2 = item4;
queue.Enqueue(item2);
}
}
if (!Config.hasGlowingEyes && (Object)(object)val != (Object)null && (Object)(object)val3 != (Object)null)
{
((Component)val).gameObject.SetActive(false);
((Component)val3).gameObject.SetActive(false);
}
if (Config.bloodyTexture && (Object)(object)bloodyMaterial != (Object)null)
{
Transform val5 = ((Component)this).transform.Find("SCP096Model");
if ((Object)(object)val5 != (Object)null)
{
Transform val6 = val5.Find("tsg_placeholder");
if ((Object)(object)val6 != (Object)null)
{
SkinnedMeshRenderer component = ((Component)val6).GetComponent<SkinnedMeshRenderer>();
if ((Object)(object)component != (Object)null)
{
((Renderer)component).material = bloodyMaterial;
}
}
}
}
switch (Config.soundPack)
{
case "SCPCB":
screamSFX = screamSFX_CB;
crySFX = crySFX_CB;
crySittingSFX = crySFX_CB;
panicSFX = panicSFX_CB;
killPlayerSFX = killPlayerSFX_CB;
break;
case "SCPCBOld":
screamSFX = screamSFX_ACB;
crySFX = crySFX_ACB;
crySittingSFX = crySFX_ACB;
panicSFX = panicSFX_ACB;
killPlayerSFX = killPlayerSFX_ACB;
break;
case "SecretLab":
screamSFX = screamSFX_SL;
crySFX = crySFX_SL;
crySittingSFX = crySFX_SL;
panicSFX = panicSFX_SL;
killPlayerSFX = killPlayerSFX_SL;
break;
}
localPlayerCamera = ((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform;
spawnPosition = ((Component)this).transform.position;
base.isOutside = ((Component)this).transform.position.y > -80f;
mainEntrancePosition = RoundManager.Instance.GetNavMeshPosition(RoundManager.FindMainEntrancePosition(true, base.isOutside), default(NavMeshHit), 5f, -1);
if (base.isOutside)
{
if (base.allAINodes == null || base.allAINodes.Length == 0)
{
base.allAINodes = GameObject.FindGameObjectsWithTag("OutsideAINode");
}
if ((Object)(object)GameNetworkManager.Instance.localPlayerController != (Object)null)
{
((EnemyAI)this).EnableEnemyMesh(!StartOfRound.Instance.hangarDoorsClosed || !GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom, false);
}
}
else if (base.allAINodes == null || base.allAINodes.Length == 0)
{
base.allAINodes = GameObject.FindGameObjectsWithTag("AINode");
}
base.path1 = new NavMeshPath();
base.openDoorSpeedMultiplier = 450f;
SetShyGuyInitialValues();
}
private void CalculateAnimationSpeed()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = ((Component)this).transform.position - previousPosition;
float num = ((Vector3)(ref val)).magnitude;
if (num > 0f)
{
num = 1f;
}
lastRunSpeed = Mathf.Lerp(lastRunSpeed, num, 5f * Time.deltaTime);
base.creatureAnimator.SetFloat("VelocityZ", lastRunSpeed);
previousPosition = ((Component)this).transform.position;
}
public override void DoAIInterval()
{
//IL_05de: Unknown result type (might be due to invalid IL or missing references)
//IL_05ee: Unknown result type (might be due to invalid IL or missing references)
//IL_0532: Unknown result type (might be due to invalid IL or missing references)
//IL_053d: Unknown result type (might be due to invalid IL or missing references)
//IL_066f: Unknown result type (might be due to invalid IL or missing references)
//IL_0675: 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_06cc: Unknown result type (might be due to invalid IL or missing references)
//IL_0698: Unknown result type (might be due to invalid IL or missing references)
//IL_055c: Unknown result type (might be due to invalid IL or missing references)
//IL_0567: Unknown result type (might be due to invalid IL or missing references)
//IL_056c: Unknown result type (might be due to invalid IL or missing references)
//IL_0766: Unknown result type (might be due to invalid IL or missing references)
//IL_0776: Unknown result type (might be due to invalid IL or missing references)
//IL_071d: Unknown result type (might be due to invalid IL or missing references)
//IL_072d: Unknown result type (might be due to invalid IL or missing references)
((EnemyAI)this).DoAIInterval();
if (StartOfRound.Instance.livingPlayers == 0)
{
lastInterval = Time.realtimeSinceStartup;
return;
}
if (base.isEnemyDead)
{
lastInterval = Time.realtimeSinceStartup;
return;
}
if (!((NetworkBehaviour)this).IsServer && ((NetworkBehaviour)this).IsOwner && base.currentBehaviourStateIndex != 2)
{
((EnemyAI)this).ChangeOwnershipOfEnemy(StartOfRound.Instance.allPlayerScripts[0].actualClientId);
}
switch (base.currentBehaviourStateIndex)
{
case 0:
{
if (base.stunNormalizedTimer > 0f)
{
base.agent.speed = 0f;
}
else if (sitting)
{
base.agent.speed = 0f;
}
else
{
roamWaitTime -= Time.realtimeSinceStartup - lastInterval;
base.openDoorSpeedMultiplier = 1f;
base.agent.speed = 2.75f * Config.speedDocileMultiplier;
}
base.movingTowardsTargetPlayer = false;
base.agent.stoppingDistance = 4f;
base.addPlayerVelocityToDestination = 0f;
PlayerControllerB targetPlayer2 = base.targetPlayer;
if (roamWaitTime <= 20f && roamMap.inProgress && (Object)(object)base.targetPlayer == (Object)null)
{
((EnemyAI)this).StopSearch(roamMap, true);
lastInterval = Time.realtimeSinceStartup;
}
else if (roamWaitTime > 2.5f && roamWaitTime <= 15f && !roamMap.inProgress && (Object)(object)base.targetPlayer == (Object)null && roamShouldSit)
{
base.creatureVoice.Stop();
sitting = true;
base.creatureAnimator.SetBool("Sitting", true);
base.creatureVoice.volume = 0.5f;
float time = base.creatureVoice.time;
base.creatureVoice.clip = crySittingSFX;
((Component)base.creatureVoice).GetComponent<AudioSource>().time = time;
base.creatureVoice.Play();
lastInterval = Time.realtimeSinceStartup;
}
else if (!((Object)(object)base.targetPlayer != (Object)null) && (Object)(object)base.targetPlayer == (Object)null && !roamMap.inProgress && roamWaitTime <= 0f)
{
if (!sitting)
{
roamShouldSit = Random.Range(1, 5) == 1;
roamWaitTime = Random.Range(25f, 32.5f);
((EnemyAI)this).StartSearch(spawnPosition, roamMap);
lastInterval = Time.realtimeSinceStartup;
break;
}
base.creatureVoice.Stop();
sitting = false;
roamShouldSit = false;
roamWaitTime = Random.Range(21f, 25f);
base.creatureAnimator.SetBool("Sitting", false);
base.creatureVoice.volume = 0.5f;
base.creatureVoice.clip = crySFX;
float time2 = base.creatureVoice.time;
((Component)base.creatureVoice).GetComponent<AudioSource>().time = time2;
base.creatureVoice.Play();
lastInterval = Time.realtimeSinceStartup;
}
break;
}
case 1:
base.agent.speed = 0f;
lastInterval = Time.realtimeSinceStartup;
base.movingTowardsTargetPlayer = false;
break;
case 2:
{
base.agent.stoppingDistance = 0f;
base.agent.avoidancePriority = 60;
base.openDoorSpeedMultiplier = 450f;
mainCollider.isTrigger = true;
base.addPlayerVelocityToDestination = 1f;
if (inKillAnimation)
{
base.agent.speed = 0f;
}
else
{
base.agent.speed = Mathf.Clamp(base.agent.speed + (Time.realtimeSinceStartup - lastInterval) * Config.speedRageMultiplier * 1.1f, 5f * Config.speedRageMultiplier, 14.75f * Config.speedRageMultiplier);
}
if (SCP096Targets.Count <= 0)
{
SitDown();
break;
}
PlayerControllerB targetPlayer = base.targetPlayer;
float num = float.PositiveInfinity;
foreach (PlayerControllerB sCP096Target in SCP096Targets)
{
bool flag = sCP096Target.isInsideFactory == !base.isOutside;
bool flag2 = true;
if (!Config.canExitFacility && !flag)
{
flag2 = false;
}
if (!sCP096Target.isPlayerDead && flag2)
{
if (((EnemyAI)this).PlayerIsTargetable(sCP096Target, false, true) && Vector3.Distance(((Component)sCP096Target).transform.position, ((Component)this).transform.position) < num)
{
num = Vector3.Magnitude(((Component)sCP096Target).transform.position - ((Component)this).transform.position);
base.targetPlayer = sCP096Target;
}
}
else
{
AddTargetToList((int)sCP096Target.actualClientId, remove: true);
}
}
if ((Object)(object)base.targetPlayer != (Object)null)
{
bool flag3 = false;
base.creatureAnimator.SetFloat("DistanceToTarget", Vector3.Distance(((Component)this).transform.position, ((Component)base.targetPlayer).transform.position));
if (roamMap.inProgress)
{
((EnemyAI)this).StopSearch(roamMap, true);
}
if ((Object)(object)base.targetPlayer != (Object)(object)targetPlayer)
{
((EnemyAI)this).ChangeOwnershipOfEnemy(base.targetPlayer.actualClientId);
}
if (base.targetPlayer.isInsideFactory != !base.isOutside)
{
if (Vector3.Distance(((Component)this).transform.position, mainEntrancePosition) < 2f)
{
TeleportEnemy(RoundManager.FindMainEntrancePosition(true, !base.isOutside), !base.isOutside);
base.agent.speed = 0f;
break;
}
base.movingTowardsTargetPlayer = false;
((EnemyAI)this).SetDestinationToPosition(mainEntrancePosition, false);
elevatorScript = Object.FindObjectOfType<MineshaftElevatorController>();
if (!((Object)(object)elevatorScript != (Object)null))
{
break;
}
ScopophobiaPlugin.logger.LogInfo((object)"Starting Elevator Checks");
if (isInElevatorStartRoom)
{
if (Vector3.Distance(((Component)this).transform.position, elevatorScript.elevatorBottomPoint.position) < 3f)
{
isInElevatorStartRoom = false;
ScopophobiaPlugin.logger.LogInfo((object)"Shy guy is at Lower Elevator");
}
}
else if (Vector3.Distance(((Component)this).transform.position, elevatorScript.elevatorTopPoint.position) < 3f)
{
isInElevatorStartRoom = true;
ScopophobiaPlugin.logger.LogInfo((object)"Shy guy is at Upper Elevator");
}
if (RoundManager.Instance.currentDungeonType == 4)
{
if (!isInElevatorStartRoom)
{
UseElevator(goUp: true);
}
else if (!base.targetPlayer.isPlayerDead && base.targetPlayer.isPlayerControlled && base.targetPlayer.isInsideFactory)
{
UseElevator(goUp: false);
}
else
{
flag3 = true;
}
}
}
else
{
((EnemyAI)this).SetMovingTowardsTargetPlayer(base.targetPlayer);
}
}
else if (SCP096Targets.Count <= 0)
{
SitDown();
}
break;
}
default:
lastInterval = Time.realtimeSinceStartup;
break;
}
}
public void TeleportEnemy(Vector3 pos, bool setOutside)
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: 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_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
Vector3 navMeshPosition = RoundManager.Instance.GetNavMeshPosition(pos, default(NavMeshHit), 5f, -1);
if (((NetworkBehaviour)this).IsOwner)
{
((Behaviour)base.agent).enabled = false;
((Component)this).transform.position = navMeshPosition;
((Behaviour)base.agent).enabled = true;
}
else
{
((Component)this).transform.position = navMeshPosition;
}
base.serverPosition = navMeshPosition;
SetEnemyOutside(setOutside);
EntranceTeleport val = RoundManager.FindMainEntranceScript(setOutside);
if (val.doorAudios != null && val.doorAudios.Length != 0)
{
val.entrancePointAudio.PlayOneShot(val.doorAudios[0]);
WalkieTalkie.TransmitOneShotAudio(val.entrancePointAudio, val.doorAudios[0], 1f);
}
}
private bool UseElevator(bool goUp)
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: 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_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_007b: 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_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
Vector3 val = ((!goUp) ? elevatorScript.elevatorTopPoint.position : elevatorScript.elevatorBottomPoint.position);
if (elevatorScript.elevatorFinishedMoving && !((EnemyAI)this).PathIsIntersectedByLineOfSight(elevatorScript.elevatorInsidePoint.position, false, false, false))
{
if (elevatorScript.elevatorDoorOpen && Vector3.Distance(((Component)this).transform.position, elevatorScript.elevatorInsidePoint.position) < 1f && elevatorScript.elevatorMovingDown == goUp)
{
elevatorScript.PressElevatorButtonOnServer(true);
}
((EnemyAI)this).SetDestinationToPosition(elevatorScript.elevatorInsidePoint.position, false);
return true;
}
if (Vector3.Distance(((Component)this).transform.position, elevatorScript.elevatorInsidePoint.position) > 1f && !((EnemyAI)this).PathIsIntersectedByLineOfSight(val, false, false, false))
{
if (elevatorScript.elevatorDoorOpen && Vector3.Distance(((Component)this).transform.position, val) < 1f && elevatorScript.elevatorMovingDown != goUp && !elevatorScript.elevatorCalled)
{
elevatorScript.CallElevatorOnServer(goUp);
}
((EnemyAI)this).SetDestinationToPosition(val, false);
return true;
}
return false;
}
public override void Update()
{
//IL_0038: 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_0074: 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_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_017f: Unknown result type (might be due to invalid IL or missing references)
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
if (base.isEnemyDead || (Object)(object)GameNetworkManager.Instance == (Object)null)
{
return;
}
CalculateAnimationSpeed();
bool flag = GameNetworkManager.Instance.localPlayerController.HasLineOfSightToPosition(shyGuyFace.position, Config.faceTriggerRange, 45, -1f);
if (flag)
{
float num = Quaternion.Angle(((Component)GameNetworkManager.Instance.localPlayerController.gameplayCamera).transform.rotation, shyGuyFace.rotation);
if (!(num <= 145f))
{
flag = false;
}
}
if (flag)
{
seeFaceTime += Time.deltaTime;
if (seeFaceTime >= Config.faceTriggerGracePeriod)
{
GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(1.25f, true);
if (!Config.hasMaxTargets || SCP096Targets.Count < Config.maxTargets)
{
AddTargetToList((int)GameNetworkManager.Instance.localPlayerController.playerClientId);
}
if (base.currentBehaviourStateIndex == 0)
{
((EnemyAI)this).SwitchToBehaviourState(1);
}
}
}
else
{
seeFaceTime = Mathf.Clamp(seeFaceTime - Time.deltaTime, 0f, timeToTrigger);
if (GameNetworkManager.Instance.localPlayerController.HasLineOfSightToPosition(((Component)this).transform.position + Vector3.up * 1f, 30f, 60, -1f) && base.currentBehaviourStateIndex == 0)
{
if (!base.thisNetworkObject.IsOwner)
{
((EnemyAI)this).ChangeOwnershipOfEnemy(GameNetworkManager.Instance.localPlayerController.actualClientId);
}
if (Vector3.Distance(((Component)this).transform.position, ((Component)GameNetworkManager.Instance.localPlayerController).transform.position) < 10f)
{
GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.65f, true);
}
else
{
GameNetworkManager.Instance.localPlayerController.JumpToFearLevel(0.25f, true);
}
}
}
switch (base.currentBehaviourStateIndex)
{
case 0:
if (previousState != 0)
{
SetShyGuyInitialValues();
previousState = 0;
mainCollider.isTrigger = true;
farAudio.volume = 0f;
base.creatureVoice.volume = 0.5f;
base.creatureVoice.clip = crySFX;
float time2 = base.creatureVoice.time;
((Component)base.creatureVoice).GetComponent<AudioSource>().time = time2;
base.creatureVoice.Play();
}
if (!base.creatureVoice.isPlaying)
{
base.creatureVoice.volume = 0.5f;
base.creatureVoice.clip = crySFX;
float time3 = base.creatureVoice.time;
((Component)base.creatureVoice).GetComponent<AudioSource>().time = time3;
base.creatureVoice.Play();
}
break;
case 1:
if (previousState != 1)
{
previousState = 1;
sitting = false;
mainCollider.isTrigger = true;
base.creatureAnimator.SetBool("Rage", false);
base.creatureAnimator.SetBool("Sitting", false);
base.creatureAnimator.SetBool("triggered", true);
base.creatureVoice.Stop();
float time4 = farAudio.time;
((Component)farAudio).GetComponent<AudioSource>().time = time4;
farAudio.volume = 0.275f;
farAudio.clip = panicSFX;
farAudio.Play();
base.agent.speed = 0f;
triggerTime = triggerDuration;
}
triggerTime -= Time.deltaTime;
if (triggerTime <= 0f)
{
((EnemyAI)this).SwitchToBehaviourState(2);
}
break;
case 2:
mainCollider.isTrigger = true;
if (previousState != 2)
{
mainCollider.isTrigger = true;
previousState = 2;
base.creatureAnimator.SetBool("Rage", true);
base.creatureAnimator.SetBool("triggered", false);
farAudio.Stop();
float time = farAudio.time;
((Component)farAudio).GetComponent<AudioSource>().time = time;
farAudio.volume = 0.4f;
farAudio.clip = screamSFX;
farAudio.Play();
}
break;
}
((EnemyAI)this).Update();
}
public void SetEnemyOutside(bool outside = false)
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
base.isOutside = outside;
mainEntrancePosition = RoundManager.Instance.GetNavMeshPosition(RoundManager.FindMainEntrancePosition(true, outside), default(NavMeshHit), 5f, -1);
if (outside)
{
base.allAINodes = GameObject.FindGameObjectsWithTag("OutsideAINode");
}
else
{
base.allAINodes = GameObject.FindGameObjectsWithTag("AINode");
}
}
public override void OnCollideWithPlayer(Collider other)
{
if (!Object.op_Implicit((Object)(object)((Component)other).gameObject.GetComponent<PlayerControllerB>()))
{
return;
}
((EnemyAI)this).OnCollideWithPlayer(other);
if (!inKillAnimation && !base.isEnemyDead && base.currentBehaviourStateIndex == 2)
{
PlayerControllerB val = ((EnemyAI)this).MeetsStandardPlayerCollisionConditions(other, false, false);
if ((Object)(object)val != (Object)null)
{
inKillAnimation = true;
((MonoBehaviour)this).StartCoroutine(killPlayerAnimation((int)val.playerClientId));
KillPlayerServerRpc((int)val.playerClientId);
}
}
}
[ServerRpc(RequireOwnership = false)]
private void KillPlayerServerRpc(int playerId)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Invalid comparison between Unknown and I4
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Invalid comparison between Unknown and I4
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2556963367u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerId);
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2556963367u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
KillPlayerClientRpc(playerId);
}
}
}
[ClientRpc]
private void KillPlayerClientRpc(int playerId)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Invalid comparison between Unknown and I4
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Invalid comparison between Unknown and I4
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2298532976u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerId);
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2298532976u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
{
((MonoBehaviour)this).StartCoroutine(killPlayerAnimation(playerId));
}
}
}
private IEnumerator killPlayerAnimation(int playerId)
{
inKillAnimation = true;
PlayerControllerB playerScript = StartOfRound.Instance.allPlayerScripts[playerId];
if (base.isOutside && ((Component)this).transform.position.y < -80f)
{
SetEnemyOutside();
}
else if (!base.isOutside && ((Component)this).transform.position.y > -80f)
{
SetEnemyOutside(outside: true);
}
int preAmount = SCP096Targets.Count;
playerScript.KillPlayer(((Component)playerScript).transform.position, true, (CauseOfDeath)6, 1, default(Vector3));
AddTargetToList(playerId, remove: true);
base.creatureSFX.clip = killPlayerSFX;
base.creatureSFX.Play();
base.creatureAnimator.SetInteger("TargetsLeft", preAmount - 1);
base.creatureAnimator.SetTrigger("kill");
if (preAmount - 1 <= 0)
{
SitDown();
}
if (Config.deathMakesBloody && (Object)(object)bloodyMaterial != (Object)null)
{
Transform model = ((Component)this).transform.Find("SCP096Model");
if ((Object)(object)model != (Object)null)
{
Transform modelMesh = model.Find("tsg_placeholder");
if ((Object)(object)modelMesh != (Object)null)
{
SkinnedMeshRenderer skinnedModel = ((Component)modelMesh).GetComponent<SkinnedMeshRenderer>();
if ((Object)(object)skinnedModel != (Object)null)
{
((Renderer)skinnedModel).material = bloodyMaterial;
}
}
}
}
yield return (object)new WaitForSeconds(1f);
inKillAnimation = false;
}
public void SitDown()
{
((EnemyAI)this).SwitchToBehaviourState(0);
SitDownOnLocalClient();
SitDownServerRpc();
}
[ServerRpc(RequireOwnership = false)]
private void SitDownServerRpc()
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Invalid comparison between Unknown and I4
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Invalid comparison between Unknown and I4
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(652446748u, val, (RpcDelivery)0);
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 652446748u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
SitDownClientRpc();
}
}
}
[ClientRpc]
private void SitDownClientRpc()
{
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Invalid comparison between Unknown and I4
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Invalid comparison between Unknown and I4
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(2536632143u, val, (RpcDelivery)0);
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 2536632143u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
{
SitDownOnLocalClient();
}
}
}
public void SitDownOnLocalClient()
{
sitting = true;
roamWaitTime = Random.Range(45f, 50f);
base.creatureAnimator.SetBool("Rage", false);
base.creatureAnimator.SetBool("Sitting", true);
}
public void AddTargetToList(int playerId, bool remove = false)
{
PlayerControllerB item = StartOfRound.Instance.allPlayerScripts[playerId];
if (remove)
{
if (!SCP096Targets.Contains(item))
{
return;
}
}
else if (SCP096Targets.Contains(item))
{
return;
}
AddTargetToListOnLocalClient(playerId, remove);
AddTargetToListServerRpc(playerId, remove);
}
[ServerRpc(RequireOwnership = false)]
public void AddTargetToListServerRpc(int playerId, bool remove)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Invalid comparison between Unknown and I4
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Invalid comparison between Unknown and I4
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost))
{
ServerRpcParams val = default(ServerRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1207108010u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerId);
((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref remove, default(ForPrimitives));
((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1207108010u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost))
{
AddTargetToListClientRpc(playerId, remove);
}
}
}
[ClientRpc]
public void AddTargetToListClientRpc(int playerId, bool remove)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Invalid comparison between Unknown and I4
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Invalid comparison between Unknown and I4
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
if ((int)((NetworkBehaviour)this).__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost))
{
ClientRpcParams val = default(ClientRpcParams);
FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1413965488u, val, (RpcDelivery)0);
BytePacker.WriteValueBitPacked(val2, playerId);
((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref remove, default(ForPrimitives));
((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1413965488u, val, (RpcDelivery)0);
}
if ((int)((NetworkBehaviour)this).__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost))
{
AddTargetToListOnLocalClient(playerId, remove);
}
}
}
public void AddTargetToListOnLocalClient(int playerId, bool remove)
{
PlayerControllerB item = StartOfRound.Instance.allPlayerScripts[playerId];
if (remove)
{
if (SCP096Targets.Contains(item))
{
SCP096Targets.Remove(item);
}
}
else if (!SCP096Targets.Contains(item))
{
SCP096Targets.Add(item);
}
}
private void SetShyGuyInitialValues()
{
mainCollider = ((Component)this).gameObject.GetComponentInChildren<Collider>();
farAudio = ((Component)((Component)this).transform.Find("FarAudio")).GetComponent<AudioSource>();
base.targetPlayer = null;
inKillAnimation = false;
SCP096Targets.Clear();
base.creatureAnimator.SetFloat("VelocityX", 0f);
base.creatureAnimator.SetFloat("VelocityZ", 0f);
base.creatureAnimator.SetFloat("DistanceToTarget", 999f);
base.creatureAnimator.SetInteger("SitActionTimer", 0);
base.creatureAnimator.SetInteger("TargetsLeft", 0);
base.creatureAnimator.SetBool("Rage", false);
base.creatureAnimator.SetBool("Sitting", false);
base.creatureAnimator.SetBool("triggered", false);
mainCollider.isTrigger = true;
farAudio.volume = 0f;
farAudio.Stop();
base.creatureVoice.Stop();
}
protected override void __initializeVariables()
{
((EnemyAI)this).__initializeVariables();
}
[RuntimeInitializeOnLoadMethod]
internal static void InitializeRPCS_ShyGuyAI()
{
//IL_001b: 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)
//IL_0026: Expected O, but got Unknown
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Expected O, but got Unknown
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0076: Unknown result type (might be due to invalid IL or missing references)
//IL_007c: Expected O, but got Unknown
//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)
//IL_00a7: Expected O, but got Unknown
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Expected O, but got Unknown
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Expected O, but got Unknown
Dictionary<uint, RpcReceiveHandler> _rpc_func_table = NetworkManager.__rpc_func_table;
object obj = <>O.<0>____rpc_handler_2556963367;
if (obj == null)
{
RpcReceiveHandler val = __rpc_handler_2556963367;
<>O.<0>____rpc_handler_2556963367 = val;
obj = (object)val;
}
_rpc_func_table.Add(2556963367u, (RpcReceiveHandler)obj);
Dictionary<uint, RpcReceiveHandler> _rpc_func_table2 = NetworkManager.__rpc_func_table;
object obj2 = <>O.<1>____rpc_handler_2298532976;
if (obj2 == null)
{
RpcReceiveHandler val2 = __rpc_handler_2298532976;
<>O.<1>____rpc_handler_2298532976 = val2;
obj2 = (object)val2;
}
_rpc_func_table2.Add(2298532976u, (RpcReceiveHandler)obj2);
Dictionary<uint, RpcReceiveHandler> _rpc_func_table3 = NetworkManager.__rpc_func_table;
object obj3 = <>O.<2>____rpc_handler_652446748;
if (obj3 == null)
{
RpcReceiveHandler val3 = __rpc_handler_652446748;
<>O.<2>____rpc_handler_652446748 = val3;
obj3 = (object)val3;
}
_rpc_func_table3.Add(652446748u, (RpcReceiveHandler)obj3);
Dictionary<uint, RpcReceiveHandler> _rpc_func_table4 = NetworkManager.__rpc_func_table;
object obj4 = <>O.<3>____rpc_handler_2536632143;
if (obj4 == null)
{
RpcReceiveHandler val4 = __rpc_handler_2536632143;
<>O.<3>____rpc_handler_2536632143 = val4;
obj4 = (object)val4;
}
_rpc_func_table4.Add(2536632143u, (RpcReceiveHandler)obj4);
Dictionary<uint, RpcReceiveHandler> _rpc_func_table5 = NetworkManager.__rpc_func_table;
object obj5 = <>O.<4>____rpc_handler_1207108010;
if (obj5 == null)
{
RpcReceiveHandler val5 = __rpc_handler_1207108010;
<>O.<4>____rpc_handler_1207108010 = val5;
obj5 = (object)val5;
}
_rpc_func_table5.Add(1207108010u, (RpcReceiveHandler)obj5);
Dictionary<uint, RpcReceiveHandler> _rpc_func_table6 = NetworkManager.__rpc_func_table;
object obj6 = <>O.<5>____rpc_handler_1413965488;
if (obj6 == null)
{
RpcReceiveHandler val6 = __rpc_handler_1413965488;
<>O.<5>____rpc_handler_1413965488 = val6;
obj6 = (object)val6;
}
_rpc_func_table6.Add(1413965488u, (RpcReceiveHandler)obj6);
}
private static void __rpc_handler_2556963367(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: 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);
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)1;
((ShyGuyAI)(object)target).KillPlayerServerRpc(playerId);
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_2298532976(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: 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);
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)2;
((ShyGuyAI)(object)target).KillPlayerClientRpc(playerId);
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_652446748(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0020: 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)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)1;
((ShyGuyAI)(object)target).SitDownServerRpc();
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_2536632143(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0020: 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)
NetworkManager networkManager = target.NetworkManager;
if (networkManager != null && networkManager.IsListening)
{
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)2;
((ShyGuyAI)(object)target).SitDownClientRpc();
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_1207108010(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: 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);
bool remove = default(bool);
((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref remove, default(ForPrimitives));
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)1;
((ShyGuyAI)(object)target).AddTargetToListServerRpc(playerId, remove);
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
}
}
private static void __rpc_handler_1413965488(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: 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);
bool remove = default(bool);
((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref remove, default(ForPrimitives));
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)2;
((ShyGuyAI)(object)target).AddTargetToListClientRpc(playerId, remove);
((NetworkBehaviour)(ShyGuyAI)(object)target).__rpc_exec_stage = (__RpcExecStage)0;
}
}
protected override string __getTypeName()
{
return "ShyGuyAI";
}
}
}
namespace Scopophobia
{
[Serializable]
public class Config : SyncedInstance<Config>
{
[CompilerGenerated]
private static class <>O
{
public static HandleNamedMessageDelegate <0>__OnRequestSync;
public static HandleNamedMessageDelegate <1>__OnReceiveSync;
}
public static ConfigEntry<bool> AppearsConfig;
public static ConfigEntry<bool> HasGlowingEyesConfig;
public static ConfigEntry<string> SoundPackConfig;
public static ConfigEntry<bool> BloodyTextureConfig;
public static ConfigEntry<bool> DisableSpawnRatesConfig;
public static ConfigEntry<bool> DeathMakesBloodyConfig;
public static ConfigEntry<float> SpeedDocileMultiplierConfig;
public static ConfigEntry<float> SpeedRageMultiplierConfig;
public static ConfigEntry<int> SpawnRarityConfig;
public static ConfigEntry<float> TriggerTimeConfig;
public static ConfigEntry<float> FaceTriggerRangeConfig;
public static ConfigEntry<float> FaceTriggerGracePeriodConfig;
public static ConfigEntry<bool> HasMaxTargetsConfig;
public static ConfigEntry<int> MaxTargetsConfig;
public static ConfigEntry<bool> CanExitFacilityConfig;
public static ConfigEntry<int> MaxSpawnCountConfig;
public static ConfigEntry<bool> CanSpawnOutsideConfig;
public static ConfigEntry<bool> SpawnOutsideHardPlanetsConfig;
public static ConfigEntry<float> StartEnemySpawnCurveConfig;
public static ConfigEntry<float> MidEnemySpawnCurveConfig;
public static ConfigEntry<float> EndEnemySpawnCurveConfig;
public static ConfigEntry<float> ShyGuyPowerLevelConfig;
public static bool appears;
public static bool hasGlowingEyes;
public static string soundPack;
public static bool bloodyTexture;
public static bool deathMakesBloody;
public static bool DisableSpawnRates;
public static float speedDocileMultiplier;
public static float speedRageMultiplier;
public static int spawnRarity;
public static float triggerTime;
public static float faceTriggerRange;
public static float faceTriggerGracePeriod;
public static bool hasMaxTargets;
public static int maxTargets;
public static bool canExitFacility;
public static bool canSpawnOutside;
public static int maxSpawnCount;
public static bool spawnsOutside;
public static bool spawnOutsideHardPlanets;
public static float startEnemySpawnCurve;
public static float midEnemySpawnCurve;
public static float endEnemySpawnCurve;
public static float ShyGuyPowerLevel;
public Config(ConfigFile cfg)
{
InitInstance(this);
AppearsConfig = cfg.Bind<bool>("General", "Enable the Shy Guy", true, "Allows the Shy Guy to spawn in-game.");
HasGlowingEyesConfig = cfg.Bind<bool>("Appearance", "Glowing Eyes", true, "Gives the Shy Guy glowing eyes similar to the Bracken/Flowerman.");
BloodyTextureConfig = cfg.Bind<bool>("Appearance", "Bloody Texture", false, "Gives the Shy Guy his bloodier, original texture from SCP: Containment Breach.");
DeathMakesBloodyConfig = cfg.Bind<bool>("Appearance", "Bloody Death", true, "Causes the Shy Guy's material to become bloody once getting his first kill. Useless if Bloody Texture is enabled lol");
DisableSpawnRatesConfig = cfg.Bind<bool>("General", "Disable Spawn Patches", false, "Disable Spawn Rate Patching. Only use this if you use another mod to alter Spawn Rates like LethalLevelLoader.");
SoundPackConfig = cfg.Bind<string>("Appearance", "Sound Pack (Curated, SCPCB, SCPCBOld, SecretLab)", "Curated", "Determines the sounds the Shy Guy uses. (SOME MAY NOT SYNC WELL WITH TRIGGER TIME) (Curated = Default, curated for the Lethal Company experience) (SCPCB = SCP-096 sounds from SCP: Containment Breach) (SCPCBOld = Old alpha SCP-096 sounds from SCP: Containment Breach) (SecretLab = SCP-096 sounds from SCP: Secret Laboratory)");
SpeedDocileMultiplierConfig = cfg.Bind<float>("Values", "Speed Multiplier (Docile)", 1f, "Determines the speed multiplier of the Shy Guy while docile.");
SpeedRageMultiplierConfig = cfg.Bind<float>("Values", "Speed Multiplier (Rage)", 1f, "Determines the speed multiplier of the Shy Guy while enraged.");
SpawnRarityConfig = cfg.Bind<int>("Values", "Spawn Rarity", 15, "Determines the spawn weight of the Shy Guy. Higher weights mean the Shy Guy is more likely appear. (just dont set this astronomically high)");
TriggerTimeConfig = cfg.Bind<float>("Values.Triggering", "Trigger Time", 66.4f, "Determines how long the Shy Guy must remain in the Triggered state to become fully enraged.");
FaceTriggerRangeConfig = cfg.Bind<float>("Values.Triggering", "Face Trigger Range", 17.5f, "Determines the face's trigger radius.");
FaceTriggerGracePeriodConfig = cfg.Bind<float>("Values.Triggering", "Face Trigger Grace Period", 0.5f, "Determines the grace period when you see the face of the Shy Guy before he becomes enraged.");
HasMaxTargetsConfig = cfg.Bind<bool>("Values.Triggering", "Has Max Targets", false, "Determines if the Shy Guy has a maximum amount of targets.");
MaxTargetsConfig = cfg.Bind<int>("Values.Triggering", "Max Targets", 32, "Determines the max amount of targets the Shy Guy can have. (requires HasMaxTargets)");
CanExitFacilityConfig = cfg.Bind<bool>("Values.Triggering", "Can Exit Facility", true, "Determines if the Shy Guy can exit the facility and into the outdoors (and vice versa) to attack its target.");
MaxSpawnCountConfig = cfg.Bind<int>("Values.Spawning", "Max Spawn Count", 1, "Determines how many Shy Guy can spawn total.");
CanSpawnOutsideConfig = cfg.Bind<bool>("Values.Spawning", "Can Spawn Outside", true, "Determines if the Shy Guy can spawn outside. ");
SpawnOutsideHardPlanetsConfig = cfg.Bind<bool>("Values.Spawning", "Spawn Outside Only Hard Moons", true, "If set to true, the Shy Guy will only spawn outside on the highest-difficulty/modded moons.");
StartEnemySpawnCurveConfig = cfg.Bind<float>("Values.Spawning", "Start Spawn Curve", 0.2f, "Spawn curve for the Shy Guy when the day starts. (typically 0-1)");
MidEnemySpawnCurveConfig = cfg.Bind<float>("Values.Spawning", "Midday Spawn Curve", 1f, "Spawn curve for the Shy Guy midday. (typically 0-1)");
EndEnemySpawnCurveConfig = cfg.Bind<float>("Values.Spawning", "End of Day Spawn Curve", 0.75f, "Spawn curve for the Shy Guy at the end of day. (typically 0-1)");
ShyGuyPowerLevelConfig = cfg.Bind<float>("Values.Spawning", "Shy Guy Power Level", 3f, "Default Power Level for the Shy Guy to take up per level. (Default: 3.0)");
appears = AppearsConfig.Value;
hasGlowingEyes = HasGlowingEyesConfig.Value;
bloodyTexture = BloodyTextureConfig.Value;
deathMakesBloody = DeathMakesBloodyConfig.Value;
DisableSpawnRates = DisableSpawnRatesConfig.Value;
soundPack = SoundPackConfig.Value;
speedDocileMultiplier = SpeedDocileMultiplierConfig.Value;
speedRageMultiplier = SpeedRageMultiplierConfig.Value;
spawnRarity = SpawnRarityConfig.Value;
triggerTime = TriggerTimeConfig.Value;
faceTriggerRange = FaceTriggerRangeConfig.Value;
faceTriggerGracePeriod = FaceTriggerGracePeriodConfig.Value;
hasMaxTargets = HasMaxTargetsConfig.Value;
maxTargets = MaxTargetsConfig.Value;
canExitFacility = CanExitFacilityConfig.Value;
maxSpawnCount = MaxSpawnCountConfig.Value;
canSpawnOutside = CanSpawnOutsideConfig.Value;
spawnOutsideHardPlanets = SpawnOutsideHardPlanetsConfig.Value;
startEnemySpawnCurve = StartEnemySpawnCurveConfig.Value;
midEnemySpawnCurve = MidEnemySpawnCurveConfig.Value;
endEnemySpawnCurve = EndEnemySpawnCurveConfig.Value;
ShyGuyPowerLevel = ShyGuyPowerLevelConfig.Value;
}
public static void RequestSync()
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
if (!SyncedInstance<Config>.IsClient)
{
return;
}
FastBufferWriter val = default(FastBufferWriter);
((FastBufferWriter)(ref val))..ctor(SyncedInstance<Config>.IntSize, (Allocator)2, -1);
try
{
SyncedInstance<Config>.MessageManager.SendNamedMessage("Scopophobia_OnRequestConfigSync", 0uL, val, (NetworkDelivery)3);
}
finally
{
((IDisposable)(FastBufferWriter)(ref val)).Dispose();
}
}
public static void OnRequestSync(ulong clientId, FastBufferReader _)
{
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
if (!SyncedInstance<Config>.IsHost)
{
return;
}
Plugin.logger.LogInfo((object)$"Config sync request received from client: {clientId}");
byte[] array = SyncedInstance<Config>.SerializeToBytes(SyncedInstance<Config>.Instance);
int num = array.Length;
FastBufferWriter val = default(FastBufferWriter);
((FastBufferWriter)(ref val))..ctor(num + SyncedInstance<Config>.IntSize, (Allocator)2, -1);
try
{
((FastBufferWriter)(ref val)).WriteValueSafe<int>(ref num, default(ForPrimitives));
((FastBufferWriter)(ref val)).WriteBytesSafe(array, -1, 0);
SyncedInstance<Config>.MessageManager.SendNamedMessage("Scopophobia_OnReceiveConfigSync", clientId, val, (NetworkDelivery)3);
}
catch (Exception arg)
{
Plugin.logger.LogInfo((object)$"Error occurred syncing config with client: {clientId}\n{arg}");
}
finally
{
((IDisposable)(FastBufferWriter)(ref val)).Dispose();
}
}
public static void OnReceiveSync(ulong _, FastBufferReader reader)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
if (!((FastBufferReader)(ref reader)).TryBeginRead(SyncedInstance<Config>.IntSize))
{
Plugin.logger.LogError((object)"Config sync error: Could not begin reading buffer.");
return;
}
int num = default(int);
((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives));
if (!((FastBufferReader)(ref reader)).TryBeginRead(num))
{
Plugin.logger.LogError((object)"Config sync error: Host could not sync.");
return;
}
byte[] data = new byte[num];
((FastBufferReader)(ref reader)).ReadBytesSafe(ref data, num, 0);
SyncedInstance<Config>.SyncInstance(data);
Plugin.logger.LogInfo((object)"Successfully synced config with host.");
}
[HarmonyPostfix]
[HarmonyPatch(typeof(PlayerControllerB), "ConnectClientToPlayerObject")]
public static void InitializeLocalPlayer()
{
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Expected O, but got Unknown
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
if (SyncedInstance<Config>.IsHost)
{
CustomMessagingManager messageManager = SyncedInstance<Config>.MessageManager;
object obj = <>O.<0>__OnRequestSync;
if (obj == null)
{
HandleNamedMessageDelegate val = OnRequestSync;
<>O.<0>__OnRequestSync = val;
obj = (object)val;
}
messageManager.RegisterNamedMessageHandler("Scopophobia_OnRequestConfigSync", (HandleNamedMessageDelegate)obj);
SyncedInstance<Config>.Synced = true;
return;
}
SyncedInstance<Config>.Synced = false;
CustomMessagingManager messageManager2 = SyncedInstance<Config>.MessageManager;
object obj2 = <>O.<1>__OnReceiveSync;
if (obj2 == null)
{
HandleNamedMessageDelegate val2 = OnReceiveSync;
<>O.<1>__OnReceiveSync = val2;
obj2 = (object)val2;
}
messageManager2.RegisterNamedMessageHandler("Scopophobia_OnReceiveConfigSync", (HandleNamedMessageDelegate)obj2);
RequestSync();
}
[HarmonyPostfix]
[HarmonyPatch(typeof(GameNetworkManager), "StartDisconnect")]
public static void PlayerLeave()
{
SyncedInstance<Config>.RevertSync();
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "Scopophobia";
public const string PLUGIN_NAME = "Scopophobia";
public const string PLUGIN_VERSION = "1.1.5";
}
[BepInPlugin("Scopophobia", "Scopophobia", "1.1.5")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class ScopophobiaPlugin : BaseUnityPlugin
{
private readonly Harmony harmony = new Harmony("Scopophobia");
public static EnemyType shyGuy;
public static AssetBundle Assets;
public static SpawnableEnemyWithRarity maskedPrefab;
public static ManualLogSource logger;
public static SpawnableEnemyWithRarity shyPrefab;
public static Config MyConfig { get; internal set; }
internal Assembly assembly => Assembly.GetExecutingAssembly();
internal string GetFilePath(string path)
{
return assembly.Location.Replace(assembly.GetName().Name + ".dll", path);
}
private void LoadAssets()
{
try
{
Assets = AssetBundle.LoadFromFile(GetFilePath("scp096"));
}
catch (Exception arg)
{
logger.LogError((object)$"Failed to load asset bundle! {arg}");
}
}
private void Awake()
{
harmony.PatchAll(typeof(Config));
LoadAssets();
logger = ((BaseUnityPlugin)this).Logger;
MyConfig = new Config(((BaseUnityPlugin)this).Config);
ConfigEntry<bool> val = default(ConfigEntry<bool>);
((BaseUnityPlugin)this).Config.TryGetEntry<bool>("General", "Enable the Shy Guy", ref val);
if (!val.Value)
{
return;
}
ConfigEntry<int> val2 = default(ConfigEntry<int>);
((BaseUnityPlugin)this).Config.TryGetEntry<int>("Values", "Spawn Rarity", ref val2);
int num = val2?.Value ?? 15;
shyGuy = Assets.LoadAsset<EnemyType>("ShyGuyDef.asset");
TerminalNode val3 = Assets.LoadAsset<TerminalNode>("ShyGuyTerminal.asset");
TerminalKeyword val4 = Assets.LoadAsset<TerminalKeyword>("ShyGuyKeyword.asset");
NetworkPrefabs.RegisterNetworkPrefab(shyGuy.enemyPrefab);
Enemies.RegisterEnemy(shyGuy, num, (LevelTypes)(-1), (SpawnType)0, val3, val4);
Type[] types = Assembly.GetExecutingAssembly().GetTypes();
Type[] array = types;
Type[] array2 = array;
foreach (Type type in array2)
{
MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
MethodInfo[] array3 = methods;
MethodInfo[] array4 = array3;
foreach (MethodInfo methodInfo in array4)
{
object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false);
if (customAttributes.Length != 0)
{
methodInfo.Invoke(null, null);
}
}
}
logger.LogInfo((object)"Scopophobia | SCP-096 has entered the facility. All remaining personnel proceed with caution.");
harmony.PatchAll(typeof(Plugin));
harmony.PatchAll(typeof(GetShyGuyPrefabForLaterUse));
if (Config.DisableSpawnRates)
{
logger.LogInfo((object)"Spawn Settings are disabled in Config. Shy guy will NOT spawn unless you use another mod like Lethal Quantities.");
}
else
{
harmony.PatchAll(typeof(ShyGuySpawnSettings));
}
}
}
}
namespace Scopophobia.Patches
{
[HarmonyPatch]
internal class GetShyGuyPrefabForLaterUse
{
[HarmonyPatch(typeof(Terminal), "Start")]
[HarmonyPostfix]
private static void SavesPrefabForLaterUse(ref SelectableLevel[] ___moonsCatalogueList)
{
SelectableLevel[] array = ___moonsCatalogueList;
SelectableLevel[] array2 = array;
SelectableLevel[] array3 = array2;
foreach (SelectableLevel val in array3)
{
foreach (SpawnableEnemyWithRarity enemy in val.Enemies)
{
if (enemy.enemyType.enemyName.ToLower() == "shy guy")
{
ScopophobiaPlugin.shyPrefab = enemy;
}
}
}
}
}
}
namespace Scopophobia.NetcodePatcher
{
[AttributeUsage(AttributeTargets.Module)]
internal class NetcodePatchedAssemblyAttribute : Attribute
{
}
}