using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LCShrinkRay.comp;
using LCShrinkRay.coroutines;
using LC_API.ClientAPI;
using LC_API.GameInterfaceAPI;
using LC_API.GameInterfaceAPI.Events.EventArgs.Player;
using LC_API.GameInterfaceAPI.Events.Handlers;
using LC_API.GameInterfaceAPI.Features;
using LC_API.Networking;
using SusMod;
using SusMod.Patches;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Events;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("SusMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SusMod")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("2fac2737-832e-47bc-a6e6-a6b97c35c5be")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
internal class Networking
{
public List<int> ImpostorList { get; set; }
public bool Vents { get; set; }
}
namespace LCShrinkRay.coroutines
{
internal class RenderVents : MonoBehaviour
{
public GameObject go { get; private set; }
public static void StartRoutine(GameObject gameObject)
{
RenderVents renderVents = gameObject.AddComponent<RenderVents>();
renderVents.go = gameObject;
((MonoBehaviour)renderVents).StartCoroutine(renderVents.run());
}
private IEnumerator run()
{
yield return (object)new WaitForSeconds(1f);
EnemyVent[] vents = Object.FindObjectsOfType<EnemyVent>();
EnemyVent[] array = vents;
foreach (EnemyVent vent in array)
{
GameObject gameObject = ((Component)((Component)((Component)vent).gameObject.transform.Find("Hinge")).gameObject.transform.Find("VentCover")).gameObject;
if ((Object)(object)gameObject == (Object)null)
{
SusModBase.mls.LogInfo((object)"A vent gameObject was null.");
continue;
}
MeshRenderer meshRenderer = gameObject.GetComponent<MeshRenderer>();
if ((Object)(object)meshRenderer == (Object)null)
{
SusModBase.mls.LogInfo((object)"A vent mesh renderer was null.");
}
else
{
((Renderer)meshRenderer).enabled = true;
}
}
}
}
}
namespace LCShrinkRay.comp
{
internal class VentsPatch
{
internal class SussifiedVent : NetworkBehaviour
{
public EnemyVent siblingVent { get; set; }
internal void Start()
{
}
internal void TeleportPlayer(PlayerControllerB player)
{
//IL_005f: 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)
Transform transform = ((Component)player).gameObject.transform;
if ((Object)(object)siblingVent != (Object)null)
{
siblingVent.ventAudio.Play();
transform.position = ((Component)siblingVent.floorNode).transform.position;
}
else
{
transform.position = new Vector3(7.9186f, 0.286f, -14.1901f);
}
}
}
private static EnemyVent[] getAllVents()
{
if (RoundManager.Instance.allEnemyVents != null && RoundManager.Instance.allEnemyVents.Length != 0)
{
return RoundManager.Instance.allEnemyVents;
}
return Object.FindObjectsOfType<EnemyVent>();
}
public static void SussifyAll()
{
Random random = new Random(StartOfRound.Instance.randomMapSeed);
if (!SusModBase.ConfigVents.Value)
{
SusModBase.mls.LogInfo((object)"Sussification of vents disabled.");
return;
}
if (!SusModBase.impostorsIDs.Contains((int)Player.LocalPlayer.ClientId))
{
SusModBase.mls.LogInfo((object)"Sussification of vents only for sussy players.");
return;
}
SusModBase.mls.LogInfo((object)"SUSSIFYING VENTS");
EnemyVent[] allVents = getAllVents();
if (allVents == null || allVents.Length == 0)
{
SusModBase.mls.LogInfo((object)"No vents to sussify.");
return;
}
GameObject gameObject = GameObject.Find("EntranceTeleportA(Clone)");
for (int i = 0; i < allVents.Length; i++)
{
SusModBase.mls.LogInfo((object)("SUSSIFYING VENT " + i));
int num = allVents.Length - i - 1;
if (num == i)
{
num = random.Next(0, allVents.Length);
}
SusModBase.mls.LogInfo((object)("\tPairing with vent " + num));
sussify(allVents[i], allVents[num]);
}
RenderVents.StartRoutine(gameObject);
}
public static void sussify(EnemyVent enemyVent, EnemyVent siblingVent)
{
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Expected O, but got Unknown
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Expected O, but got Unknown
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_012f: Expected O, but got Unknown
//IL_0130: Unknown result type (might be due to invalid IL or missing references)
//IL_013a: Expected O, but got Unknown
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0145: Expected O, but got Unknown
GameObject gameObject = ((Component)((Component)((Component)enemyVent).gameObject.transform.Find("Hinge")).gameObject.transform.Find("VentCover")).gameObject;
if (!Object.op_Implicit((Object)(object)gameObject))
{
SusModBase.mls.LogInfo((object)"Vent has no cover to sussify");
return;
}
gameObject.GetComponent<MeshRenderer>();
gameObject.tag = "InteractTrigger";
gameObject.layer = LayerMask.NameToLayer("InteractableObject");
SussifiedVent sussifiedVent = ((Component)enemyVent).gameObject.AddComponent<SussifiedVent>();
sussifiedVent.siblingVent = siblingVent;
InteractTrigger val = gameObject.AddComponent<InteractTrigger>();
gameObject.AddComponent<BoxCollider>();
GameObject obj = GameObject.Find("StartGameLever");
val.hoverIcon = ((obj == null) ? null : obj.GetComponent<InteractTrigger>()?.hoverIcon);
val.hoverTip = "Enter : [LMB]";
val.interactable = true;
val.oneHandedItemAllowed = true;
val.twoHandedItemAllowed = true;
val.holdInteraction = true;
val.timeToHold = 1.5f;
val.timeToHoldSpeedMultiplier = 1f;
val.holdingInteractEvent = new InteractEventFloat();
val.onInteract = new InteractEvent();
val.onInteractEarly = new InteractEvent();
val.onStopInteract = new InteractEvent();
val.onCancelAnimation = new InteractEvent();
((UnityEvent<PlayerControllerB>)(object)val.onInteract).AddListener((UnityAction<PlayerControllerB>)delegate(PlayerControllerB player)
{
sussifiedVent.TeleportPlayer(player);
});
((Behaviour)val).enabled = true;
gameObject.GetComponent<Renderer>().enabled = true;
SusModBase.mls.LogInfo((object)("VentCover Object: " + ((Object)gameObject).name));
SusModBase.mls.LogInfo((object)("VentCover Renderer Enabled: " + gameObject.GetComponent<Renderer>().enabled));
SusModBase.mls.LogInfo((object)("Hover Icon: " + (((Object)(object)val.hoverIcon != (Object)null) ? ((Object)val.hoverIcon).name : "null")));
}
public static void rerenderAllSussified()
{
MeshRenderer val = ((Component)((Component)GameObject.Find("VentEntrance").gameObject.transform.Find("Hinge")).gameObject.transform.Find("VentCover")).gameObject.GetComponentsInChildren<MeshRenderer>()[0];
((Renderer)val).enabled = true;
}
public static void unsussifyAll()
{
EnemyVent[] allVents = getAllVents();
foreach (EnemyVent enemyVent in allVents)
{
unsussify(enemyVent);
}
}
public static void unsussify(EnemyVent enemyVent)
{
GameObject gameObject = ((Component)((Component)((Component)enemyVent).gameObject.transform.Find("Hinge")).gameObject.transform.Find("VentCover")).gameObject;
if (Object.op_Implicit((Object)(object)gameObject))
{
SusModBase.mls.LogInfo((object)"0");
if ((Object)(object)((Component)enemyVent).gameObject.AddComponent<SussifiedVent>() != (Object)null)
{
Object.Destroy((Object)(object)((Component)enemyVent).gameObject.AddComponent<SussifiedVent>());
}
if ((Object)(object)gameObject.GetComponent<BoxCollider>() != (Object)null)
{
Object.Destroy((Object)(object)gameObject.GetComponent<BoxCollider>());
}
if ((Object)(object)gameObject.GetComponent<InteractTrigger>() != (Object)null)
{
Object.Destroy((Object)(object)gameObject.GetComponent<InteractTrigger>());
}
}
}
}
}
namespace TestMod.Patches
{
[HarmonyPatch(typeof(StartMatchLever))]
internal class LeverPatch
{
[HarmonyPatch("Update")]
[HarmonyPostfix]
public static void ImpLever()
{
try
{
if (SusModBase.impostorsIDs.Contains((int)Player.LocalPlayer.ClientId))
{
InteractTrigger triggerScript = Object.FindObjectOfType<StartMatchLever>().triggerScript;
triggerScript.interactable = false;
triggerScript.disabledHoverTip = "Impostor can't start the ship";
}
}
catch
{
}
}
}
}
namespace SusMod
{
[BepInPlugin("Sussy", "SusCompany", "1.1.0")]
public class SusModBase : BaseUnityPlugin
{
private const string modGUID = "Sussy";
private const string modName = "SusCompany";
private const string modVersion = "1.1.0";
private readonly Harmony harmony = new Harmony("Sussy");
private static SusModBase Instance;
public static ManualLogSource mls;
public static List<int> impostorsIDs = new List<int>();
public static bool DebugMode = false;
public static ConfigEntry<float> ConfigimpostorSpawnRate;
public static ConfigEntry<bool> ConfigisImposterCountRandom;
public static ConfigEntry<bool> ConfigVents;
private void Awake()
{
if ((Object)(object)Instance == (Object)null)
{
Instance = this;
}
ConfigimpostorSpawnRate = ((BaseUnityPlugin)this).Config.Bind<float>("General", "SpawnRate", 0.25f, "Spawn rate of impostors");
ConfigisImposterCountRandom = ((BaseUnityPlugin)this).Config.Bind<bool>("General.Toggles", "IsRandomSpawnRate", true, "If true, impostor spawn rate will be randomized between 0 and SpawnRate");
ConfigVents = ((BaseUnityPlugin)this).Config.Bind<bool>("General.Toggles", "AreVentsOn", true, "If true, impostor is albe to teleports beetwen vents");
mls = Logger.CreateLogSource("Sussy");
mls.LogInfo((object)"The SusCompany mod has awaken");
harmony.PatchAll();
Player.Dying += OtherFunctions.OnDiedCheckForImpostorVictory;
Player.Left += OtherFunctions.OnLeftCheckForImpostorVictory;
Network.RegisterAll();
ConsoleCommands.RegisterConsoleCommands();
}
}
}
namespace SusMod.Patches
{
[HarmonyPatch(typeof(EnemyAI))]
internal class EnemyAiPatch
{
[HarmonyPatch("PlayerIsTargetable")]
[HarmonyPostfix]
public static void MonstersDontTarget(PlayerControllerB playerScript, ref bool __result)
{
if (SusModBase.impostorsIDs.Contains((int)playerScript.actualClientId))
{
__result = false;
SusModBase.mls.LogInfo((object)("Player " + playerScript.actualClientId + " is impostor and is not targetable"));
}
}
[HarmonyPatch(typeof(EnemyAI), "MeetsStandardPlayerCollisionConditions")]
[HarmonyPostfix]
public static void MeetsStandardPlayerCollisionConditions(ref PlayerControllerB __result)
{
try
{
if (SusModBase.impostorsIDs.Contains((int)__result.actualClientId))
{
SusModBase.mls.LogInfo((object)("Player " + __result.actualClientId + " is impostor and shouldnt colide with mobs"));
__result = null;
}
}
catch
{
}
}
[HarmonyPatch("CheckLineOfSightForPlayer")]
[HarmonyPostfix]
public static void CheckLineOfSightForPlayerOverwrite(ref PlayerControllerB __result)
{
try
{
if (SusModBase.impostorsIDs.Contains((int)__result.actualClientId))
{
SusModBase.mls.LogInfo((object)("Player " + __result.actualClientId + " is impostor and should not be in line of sight check"));
__result = null;
}
}
catch
{
}
}
}
internal class NetworkingPatch
{
public static void SynchronizeImpList()
{
SusModBase.mls.LogInfo((object)"Sending imp list to clients");
Network.Broadcast<Networking>("SyncImpList", new Networking
{
ImpostorList = SusModBase.impostorsIDs,
Vents = SusModBase.ConfigVents.Value
});
if (SusModBase.ConfigVents.Value)
{
VentsPatch.SussifyAll();
}
}
}
internal class ConsoleCommands
{
public static void RegisterConsoleCommands()
{
SusModBase.mls.LogInfo((object)"Registering console commands");
CommandHandler.RegisterCommand("susmax", (Action<string[]>)delegate(string[] args)
{
if (CheckConsoleCommand())
{
if (int.TryParse(args[0], out var result) && result <= 100 && result >= 0)
{
SusModBase.mls.LogInfo((object)("Impostors chance changed to " + args[0].ToString() + "%"));
SusModBase.ConfigimpostorSpawnRate.Value = float.Parse(args[0]) / 100f;
Player.LocalPlayer.QueueTip("Succes", "Impostors chance changed succesfuly to " + args[0].ToString() + "%", 1f, 0, false, false, "LC_Tip1");
}
else
{
SusModBase.mls.LogInfo((object)"Invalid argument");
Player.LocalPlayer.QueueTip("Error", "Invalid argument - accepted arguments: [0-100%]", 3f, 0, true, false, "LC_Tip1");
}
}
});
CommandHandler.RegisterCommand("susrandom", (Action<string[]>)delegate(string[] args)
{
if (CheckConsoleCommand())
{
if (args[0] == "yes" || args[0] == "true" || args[0] == "1")
{
SusModBase.mls.LogInfo((object)"Impostors Random changed to true");
SusModBase.ConfigisImposterCountRandom.Value = true;
Player.LocalPlayer.QueueTip("Succes", "Impostors Randomization changed succesfuly to true ", 1f, 0, false, false, "LC_Tip1");
}
else if (args[0] == "no" || args[0] == "false" || args[0] == "0")
{
SusModBase.mls.LogInfo((object)"Impostors Random changed to false");
SusModBase.ConfigisImposterCountRandom.Value = false;
Player.LocalPlayer.QueueTip("Succes", "Impostors Randomization changed succesfuly to false ", 1f, 0, false, false, "LC_Tip1");
}
else
{
SusModBase.mls.LogInfo((object)"Invalid argument");
Player.LocalPlayer.QueueTip("Error", "Invalid argument - accepted arguments: yes , no", 3f, 0, true, false, "LC_Tip1");
}
}
});
CommandHandler.RegisterCommand("susdebug", (Action<string[]>)delegate
{
SusModBase.DebugMode = true;
SusModBase.mls.LogInfo((object)"Debug mode enabled");
Player.LocalPlayer.QueueTip("Succes", "Debug mode enabled", 1f, 0, false, false, "LC_Tip1");
});
CommandHandler.RegisterCommand("susvent", (Action<string[]>)delegate(string[] args)
{
if (CheckConsoleCommand())
{
if (args[0] == "yes" || args[0] == "true" || args[0] == "1")
{
SusModBase.mls.LogInfo((object)"Impostors Vents changed to true");
SusModBase.ConfigVents.Value = true;
Player.LocalPlayer.QueueTip("Succes", "Impostors Vents changed succesfuly to true ", 1f, 0, false, false, "LC_Tip1");
}
else if (args[0] == "no" || args[0] == "false" || args[0] == "0")
{
SusModBase.mls.LogInfo((object)"Impostors Vents changed to false");
SusModBase.ConfigVents.Value = false;
Player.LocalPlayer.QueueTip("Succes", "Impostors Vents changed succesfuly to false ", 1f, 0, false, false, "LC_Tip1");
}
else
{
SusModBase.mls.LogInfo((object)"Invalid argument");
Player.LocalPlayer.QueueTip("Error", "Invalid argument - accepted arguments: yes , no", 3f, 0, true, false, "LC_Tip1");
}
}
});
CommandHandler.RegisterCommand("sushelp", (Action<string[]>)delegate
{
Player.LocalPlayer.QueueTip("HELPING", "/susmax [% of all players] | /susrandom [yes,no] | /susvent [yes,no] ", 5f, 0, false, false, "LC_Tip1");
});
}
public static bool CheckConsoleCommand()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
if ((int)GameState.ShipState == 0)
{
if (Player.LocalPlayer.IsHost)
{
return true;
}
SusModBase.mls.LogInfo((object)"You are not the host");
Player.LocalPlayer.QueueTip("Error", "You are not the host", 3f, 0, true, false, "LC_Tip1");
}
else
{
SusModBase.mls.LogInfo((object)"Can't change impostors config while not in orbit");
Player.LocalPlayer.QueueTip("Error", "Can't change impostors config while not in orbit", 3f, 0, true, false, "LC_Tip1");
}
return false;
}
}
[HarmonyPatch(typeof(Turret))]
internal class TurretPach
{
[HarmonyPatch("CheckForPlayersInLineOfSight")]
[HarmonyPostfix]
public static void ExcludeImposterFromLineOfSight(ref PlayerControllerB __result)
{
try
{
if (SusModBase.impostorsIDs.Contains((int)__result.actualClientId))
{
SusModBase.mls.LogInfo((object)("Player " + __result.actualClientId + " is impostor and is not targetable by turret"));
__result = null;
}
}
catch
{
}
}
}
internal class OtherFunctions
{
public static void CheckForImpostorVictory()
{
SusModBase.mls.LogInfo((object)"Checking for Impostor Victory");
int num = 0;
IEnumerator<Player> enumerator = Player.ActiveList.GetEnumerator();
while (enumerator.MoveNext())
{
if (!enumerator.Current.IsDead && !SusModBase.impostorsIDs.Contains((int)enumerator.Current.ClientId))
{
num++;
}
}
SusModBase.mls.LogInfo((object)("aliveCrewMates is : " + num));
if (num == 0)
{
SusModBase.mls.LogInfo((object)"Impostors Won");
StartOfRound.Instance.ShipLeaveAutomatically(false);
}
}
public static void OnDiedCheckForImpostorVictory(DyingEventArgs dyingEventArgs)
{
CheckForImpostorVictory();
}
public static void OnLeftCheckForImpostorVictory(LeftEventArgs leftEventArgs)
{
if (leftEventArgs.Player.IsLocalPlayer)
{
SusModBase.mls.LogInfo((object)"Local player has left, Clearing Player.Dictionary");
Player.Dictionary.Clear();
}
CheckForImpostorVictory();
}
public static void RemoveImposter()
{
SusModBase.impostorsIDs.Clear();
Player.LocalPlayer.PlayerController.nightVision.intensity = 1000f;
Player.LocalPlayer.PlayerController.nightVision.range = 2000f;
((Behaviour)Player.LocalPlayer.PlayerController.nightVision).enabled = false;
SusModBase.mls.LogInfo((object)"Removing Impostors");
}
public static void GetImpostorStartingItem(int ItemNumber, Player player)
{
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
string text = ItemNumber switch
{
1 => "Shovel",
2 => "Tragedy",
3 => "Extension ladder",
4 => "Zap gun",
5 => "Stun grenade",
6 => "Shotgun",
7 => "Key",
_ => "",
};
SusModBase.mls.LogInfo((object)("itemNameIm is:" + text));
SusModBase.mls.LogInfo((object)("ItemNumber is:" + ItemNumber));
Item val = Item.CreateAndSpawnItem(text, false, player.Position, default(Quaternion));
SusModBase.mls.LogInfo((object)("item is:" + (object)val));
val.ItemProperties.itemName = "Impostor's " + text;
val.ItemProperties.twoHanded = false;
val.ItemProperties.isConductiveMetal = false;
val.ItemProperties.isScrap = false;
if (text == "Tragedy")
{
val.ScanNodeProperties.maxRange = 1;
}
SusModBase.mls.LogInfo((object)("Testing item name" + ((Object)val).name));
SusModBase.mls.LogInfo((object)("Testing player name" + ((Object)player).name));
SusModBase.mls.LogInfo((object)"Trying to add item to slot");
if (player.IsLocalPlayer)
{
try
{
Player.LocalPlayer.Inventory.TryAddItemToSlot(val, 3, false);
return;
}
catch
{
SusModBase.mls.LogInfo((object)"Failed to add item to LOCAL slot 3 ");
return;
}
}
try
{
player.Inventory.TryAddItemToSlot(val, 3, false);
}
catch
{
SusModBase.mls.LogInfo((object)"Failed to add item to slot 3");
}
}
}
[HarmonyPatch(typeof(PlayerControllerB))]
internal class PlayerControllerBPatch
{
[HarmonyPatch("Update")]
[HarmonyPostfix]
public static void PlayerControllerUpdate()
{
//IL_00a8: 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)
IEnumerator<Player> enumerator = Player.ActiveList.GetEnumerator();
while (enumerator.MoveNext())
{
if (SusModBase.impostorsIDs.Contains((int)enumerator.Current.ClientId) && enumerator.Current.IsControlled && SusModBase.impostorsIDs.Contains((int)Player.LocalPlayer.ClientId))
{
enumerator.Current.PlayerController.usernameBillboardText.canvasRenderer.SetColor(Color.red);
enumerator.Current.PlayerController.usernameAlpha.alpha = 1f;
}
else
{
enumerator.Current.PlayerController.usernameBillboardText.canvasRenderer.SetColor(Color.white);
}
}
try
{
if (SusModBase.impostorsIDs.Contains((int)Player.LocalPlayer.ClientId))
{
Player.LocalPlayer.PlayerController.sprintMeter = 1f;
((Behaviour)Player.LocalPlayer.PlayerController.nightVision).enabled = true;
}
}
catch
{
SusModBase.mls.LogInfo((object)"Failed to get Player.LocalPlayer.ClientId");
}
if (UnityInput.Current.GetKeyDown("F5"))
{
SusModBase.mls.LogInfo((object)"F5 pressed");
if (SusModBase.DebugMode)
{
int ___randomMapSeed = 111111111;
int ___currentLevelID = 4;
if (!SusModBase.impostorsIDs.Contains((int)Player.LocalPlayer.ClientId))
{
StartOfRoundPatch.ImpostorStartGame(ref ___randomMapSeed, ref ___currentLevelID);
}
}
}
if (UnityInput.Current.GetKeyDown("F6"))
{
SusModBase.mls.LogInfo((object)"F6 pressed");
if (SusModBase.DebugMode)
{
OtherFunctions.RemoveImposter();
}
}
if (UnityInput.Current.GetKeyDown("F7"))
{
SusModBase.mls.LogInfo((object)"F7 pressed");
if (SusModBase.DebugMode)
{
OtherFunctions.GetImpostorStartingItem(7, Player.LocalPlayer);
}
}
if (UnityInput.Current.GetKeyDown("F8"))
{
SusModBase.mls.LogInfo((object)"F8 pressed");
if (SusModBase.DebugMode)
{
Player.LocalPlayer.PlayerController.movementSpeed = 30f;
Player.LocalPlayer.PlayerController.climbSpeed = 100f;
}
}
if (UnityInput.Current.GetKeyDown("F9"))
{
SusModBase.mls.LogInfo((object)"F9 pressed");
if (!SusModBase.DebugMode)
{
}
}
}
[HarmonyPatch("KillPlayerClientRpc")]
[HarmonyPostfix]
public static void KillPlayerClientRpcPatch()
{
OtherFunctions.CheckForImpostorVictory();
}
[HarmonyPatch("KillPlayerServerRpc")]
[HarmonyPostfix]
public static void KillPlayerServerRpcPatch()
{
OtherFunctions.CheckForImpostorVictory();
}
}
[HarmonyPatch(typeof(StartOfRound))]
internal class StartOfRoundPatch
{
[HarmonyPatch("OnShipLandedMiscEvents")]
[HarmonyPostfix]
public static void ImpostorStartGame(ref int ___randomMapSeed, ref int ___currentLevelID)
{
if (___currentLevelID == 3 || !Player.LocalPlayer.IsHost)
{
return;
}
SusModBase.mls.LogInfo((object)("Seed is : " + ___randomMapSeed));
SusModBase.impostorsIDs.Clear();
Random random = new Random(___randomMapSeed);
float value = SusModBase.ConfigimpostorSpawnRate.Value;
bool value2 = SusModBase.ConfigisImposterCountRandom.Value;
int num = (int)((float)Player.ActiveList.Count * value);
SusModBase.mls.LogInfo((object)("Player.ActiveList.Count is : " + Player.ActiveList.Count));
SusModBase.mls.LogInfo((object)("impostorsToSpawn is : " + num));
if (value2)
{
num = random.Next(0, num + 1);
SusModBase.mls.LogInfo((object)"Spawn rate is randomized");
}
int choosenImpostorID;
while (SusModBase.impostorsIDs.Count < num)
{
List<Player> list = Player.ActiveList.ToList();
list.Sort((Player x, Player y) => x.ClientId.CompareTo(y.ClientId));
choosenImpostorID = (int)list.ElementAt(random.Next(0, list.Count)).ClientId;
if (!SusModBase.impostorsIDs.Contains(choosenImpostorID))
{
SusModBase.impostorsIDs.Add(choosenImpostorID);
OtherFunctions.GetImpostorStartingItem(random.Next(1, 6), ((IEnumerable<Player>)Player.ActiveList).FirstOrDefault((Func<Player, bool>)((Player p) => (int)p.ClientId == choosenImpostorID)));
SusModBase.mls.LogInfo((object)("Client ID " + choosenImpostorID + " is impostor"));
}
}
NetworkingPatch.SynchronizeImpList();
ImpostorLever();
}
[HarmonyPatch("ShipHasLeft")]
[HarmonyPrefix]
public static void ShipHasLeftPatch()
{
OtherFunctions.RemoveImposter();
VentsPatch.unsussifyAll();
}
[NetworkMessage("SyncImpList", false)]
public static void SyncHandler(ulong sender, Networking message)
{
SusModBase.mls.LogInfo((object)"Recived imp list from host");
SusModBase.impostorsIDs = message.ImpostorList;
if (SusModBase.impostorsIDs.Contains((int)Player.LocalPlayer.ClientId))
{
HUDManager.Instance.DisplayTip("Alert", "You Are The Impostor!", true, false, "");
Player.LocalPlayer.PlayerController.nightVision.intensity = 3000f;
Player.LocalPlayer.PlayerController.nightVision.range = 5000f;
}
if (message.Vents)
{
VentsPatch.SussifyAll();
}
ImpostorLever();
}
public static void ImpostorLever()
{
if (SusModBase.impostorsIDs.Contains((int)Player.LocalPlayer.ClientId))
{
InteractTrigger triggerScript = Object.FindObjectOfType<StartMatchLever>().triggerScript;
triggerScript.interactable = false;
triggerScript.disabledHoverTip = "Impostor can't start the ship";
}
}
}
}