Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of PouetHunterGame v1.0.1
PouetHunterGame.dll
Decompiled 10 months agousing 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 System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using PouetHunterGame.Object; using PouetHunterGame.Useful; using TMPro; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("PouetHunterGame")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("PouetHunterGame")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("4bfd40e1-a03f-48d7-9539-7b383e562621")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace PouetHunterGame { [BepInPlugin("Xelan.PouetHunterGame", "PouetHunterGame", "1.0.0")] public class PouetHunterGame : BaseUnityPlugin { private const string modGUID = "Xelan.PouetHunterGame"; private const string modName = "PouetHunterGame"; private const string modVersion = "1.0.0"; private readonly Harmony harmony = new Harmony("Xelan.PouetHunterGame"); private static PouetHunterGame Instance; public static ManualLogSource Logger; public static ConfigEntry<bool> SpawnJetpack; public static ConfigEntry<bool> SpawnBeltbagForHunters; public static ConfigEntry<bool> SpawnMapperForHunters; public static ConfigEntry<bool> DisplayNewHunterName; public static ConfigEntry<bool> CanChosenScrapBeTwoHanded; public static ConfigEntry<bool> MonstersInside; public static ConfigEntry<bool> MonstersOutside; public static ConfigEntry<int> ShotgunAmount; public static ConfigEntry<int> AmmoAmount; public static ConfigEntry<int> StartingHour; public static ConfigEntry<int> EndingHour; public static ConfigEntry<int> TotalRounds; public static ConfigEntry<int> NbScraps; public static PlayerControllerB[] players; public static HashSet<PlayerControllerB> hunters = new HashSet<PlayerControllerB>(); public static HashSet<ulong> welcomedPlayers = new HashSet<ulong>(); public static HashSet<GrabbableObject> AlreadyCollectedScraps = new HashSet<GrabbableObject>(); public static Dictionary<string, int> WinsAsHunter = new Dictionary<string, int>(); public static Dictionary<string, int> WinsAsPouet = new Dictionary<string, int>(); public static Dictionary<string, string> playersColor = new Dictionary<string, string>(); public static string scrapChosenName; public static int numRound = 1; public static bool HuntersWon = true; public static bool GameAlreadyOver = false; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } Logger = Logger.CreateLogSource("Xelan.PouetHunterGame"); Logger.LogInfo((object)"╔═══════════════════════════════════════════════╗"); Logger.LogInfo((object)"║ PouetHunterGame is UP ! ║"); Logger.LogInfo((object)"╚═══════════════════════════════════════════════╝"); LoadConfig(); harmony.PatchAll(); } private void LoadConfig() { SpawnJetpack = Bind("Paramètre de la partie", "Jetpack", defaultValue: false, "Fait apparaître des Jetpack pour chaque joueur au début de la partie"); StartingHour = Bind("Paramètre de la partie", "Heure de départ", 9, "Heure à partir de laquelle les Pouets ne peuvent plus sortir de la Facility sans l'objet recherché"); EndingHour = Bind("Paramètre de la partie", "Heure de fin", 24, "Heure à partir de laquelle la partie se termine"); TotalRounds = Bind("Paramètre de la partie", "Nombre de manche", 5, "Nombre de manche dans la partie (1 Manche = 1 Jour)"); NbScraps = Bind("Paramètre de la partie", "Nombre de Scraps", 3, "Nombre de Scraps permettant de devenir Hunter"); CanChosenScrapBeTwoHanded = Bind("Paramètre de la partie", "Scraps à 2 mains", defaultValue: true, "Est-ce que l'objet à récupérer peut être un objet à 2 mains ?"); MonstersInside = Bind("Paramètre de la partie", "Monstres Interieur", defaultValue: true, "Est-ce que les monstres apparaissent à l'intérieur ?"); MonstersOutside = Bind("Paramètre de la partie", "Monstres Exterieur", defaultValue: true, "Est-ce que les monstres apparaissent à l'extérieur ?"); ShotgunAmount = Bind("Paramètre des Hunters", "Nombre de Shotgun", 1, "Nombre de Shotgun à faire apparaître pour les Hunters"); AmmoAmount = Bind("Paramètre des Hunters", "Nombre de Munition", 8, "Nombre de Munition à faire apparaître pour les Hunters"); SpawnBeltbagForHunters = Bind("Paramètre des Hunters", "Beltbag", defaultValue: false, "Fait apparaître des Beltbags pour les Hunters"); SpawnMapperForHunters = Bind("Paramètre des Hunters", "Mapper", defaultValue: false, "Fait apparaître des Mappers pour les Hunters 2h avant la fin du temps"); DisplayNewHunterName = Bind("Paramètre des Hunters", "Afficher nouveau Hunter", defaultValue: false, "Lorsque quelqu'un devient Hunter, affiche son nom via Transmit"); CreateIntConfig(StartingHour, 9, 23); CreateIntConfig(EndingHour, 12, 24); CreateIntConfig(TotalRounds, 1, 10); CreateIntConfig(NbScraps, 1, 10); CreateIntConfig(ShotgunAmount, 0, 5); CreateIntConfig(AmmoAmount, 0, 20); } private ConfigEntry<T> Bind<T>(string section, string key, T defaultValue, string description) { return ((BaseUnityPlugin)this).Config.Bind<T>(section, key, defaultValue, description); } private void CreateIntConfig(ConfigEntry<int> configEntry, int min = 0, int max = 100) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Expected O, but got Unknown //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown IntSliderOptions val = new IntSliderOptions(); ((BaseRangeOptions<int>)val).Min = min; ((BaseRangeOptions<int>)val).Max = max; ((BaseOptions)val).RequiresRestart = false; IntSliderConfigItem val2 = new IntSliderConfigItem(configEntry, val); LethalConfigManager.AddConfigItem((BaseConfigItem)(object)val2); } } } namespace PouetHunterGame.Useful { internal class ColorManager { private static readonly Regex HexColorRegex = new Regex("^#([0-9a-fA-F]{6})$", RegexOptions.Compiled); public static string GetRandomHexColor() { Random random = new Random(); int num = random.Next(256); int num2 = random.Next(256); int num3 = random.Next(256); return $"#{num:X2}{num2:X2}{num3:X2}"; } public static string GetPlayerColor(PlayerControllerB player) { return PouetHunterGame.playersColor.ContainsKey(player.playerUsername) ? PouetHunterGame.playersColor[player.playerUsername] : "white"; } public static string SetNewColorForPlayer(PlayerControllerB player, string newColor) { string text = PouetHunterGame.playersColor[player.playerUsername]; if (CouleursToHEX.CouleursHEX.TryGetValue(newColor.ToLower(), out var value)) { text = value; } else if (HexColorRegex.IsMatch(newColor)) { text = newColor; } PouetHunterGame.playersColor[player.playerUsername] = text; return text; } } internal class GameOverManager { public static bool IsGameOver() { if (!TimeOfDay.Instance.timeHasStarted) { return false; } bool allPlayersDead = StartOfRound.Instance.allPlayersDead; bool flag = TimeOfDay.Instance.hour >= GameUtils.GetValidHour(PouetHunterGame.EndingHour.Value, 12, 24); if (allPlayersDead || flag || (!IsThereAChoosenScrapLeftInside() && AllHuntersAreDead() && !IsThereAChoosenScrapBeingHeldOutside())) { PouetHunterGame.HuntersWon = false; return true; } if (AllPouetsAreDead()) { return true; } if (OnlyOnePlayerRemain()) { PouetHunterGame.HuntersWon = false; return true; } return false; } public static bool AllHuntersAreDead() { return PouetHunterGame.hunters.All((PlayerControllerB x) => x.isPlayerDead); } public static bool AllPouetsAreDead() { return PouetHunterGame.players.Where((PlayerControllerB x) => !x.isPlayerDead).All((PlayerControllerB x) => PouetHunterGame.hunters.Contains(x)); } public static bool OnlyOnePlayerRemain() { return PouetHunterGame.players.Count((PlayerControllerB x) => !x.isPlayerDead) == 1; } public static bool IsThereAChoosenScrapLeftInside() { List<GrabbableObject> list = (from x in Object.FindObjectsOfType<GrabbableObject>() where x.itemProperties.itemName.Equals(PouetHunterGame.scrapChosenName) && x.isInFactory select x).ToList(); return list.Count != 0; } public static bool IsThereAChoosenScrapBeingHeldOutside() { List<GrabbableObject> list = (from x in Object.FindObjectsOfType<GrabbableObject>() where x.itemProperties.itemName.Equals(PouetHunterGame.scrapChosenName) && !x.isInFactory && x.isHeld select x).ToList(); return list.Count != 0; } public static void DisplaysWinners() { Dictionary<PlayerControllerB, int> dictionary = new Dictionary<PlayerControllerB, int>(); PlayerControllerB[] players = PouetHunterGame.players; foreach (PlayerControllerB val in players) { string playerUsername = val.playerUsername; int num = (PouetHunterGame.WinsAsHunter.ContainsKey(playerUsername) ? PouetHunterGame.WinsAsHunter[playerUsername] : 0); int num2 = (PouetHunterGame.WinsAsPouet.ContainsKey(playerUsername) ? PouetHunterGame.WinsAsPouet[playerUsername] : 0); dictionary[val] = num + num2; } int maxWins = dictionary.Values.Max(); List<PlayerControllerB> list = (from x in dictionary where x.Value == maxWins select x.Key).ToList(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("<color=white>[</color><color=#FFC000>Partie Terminée</color><color=white>]</color>\n"); if (list.Count > 1) { stringBuilder.Append("<color=#FFC000>Gagnants :</color>\n"); } else { stringBuilder.Append("<color=#FFC000>Gagnant :</color>\n"); } foreach (PlayerControllerB item in list) { stringBuilder.Append("<color=" + ColorManager.GetPlayerColor(item) + ">" + item.playerUsername + "</color>\n"); } HUDManager.Instance.AddTextToChatOnServer(stringBuilder.ToString(), -1); } public static IEnumerator KillRemainingPlayerWithDelay() { yield return (object)new WaitForSeconds(5f); foreach (PlayerControllerB player in PouetHunterGame.players.Where((PlayerControllerB x) => !x.isPlayerDead)) { player.DamagePlayerFromOtherClientServerRpc(200, Vector3.zero, 0); PouetHunterGame.Logger.LogInfo((object)("Killing " + player.playerUsername + " as he was still ALIVE")); } } } internal class GameUtils { public static void DisplayTip(string title, string msg, bool isWarning = false) { HUDManager.Instance.DisplayTip(title, msg, isWarning, false, "LC_Tip1"); } public static void ClearChat() { HUDManager instance = HUDManager.Instance; if (instance != null) { for (int i = 0; i < 3; i++) { instance.AddTextToChatOnServer("\u00a0", -1); instance.AddTextToChatOnServer("\u00a0\u00a0", -1); } } } public static bool IsPlayerHolding(PlayerControllerB player, string scrapName) { return player.ItemSlots.Where((GrabbableObject scrap) => (Object)(object)scrap != (Object)null).Any((GrabbableObject scrap) => string.Equals(scrap.itemProperties.itemName, scrapName, StringComparison.OrdinalIgnoreCase)); } public static int GetValidHour(int hour, int min, int max) { if (hour < min) { return min - 6; } if (hour > max) { return max - 6; } return hour - 6; } public static void ResetRound() { PouetHunterGame.hunters.Clear(); PouetHunterGame.HuntersWon = true; PouetHunterGame.GameAlreadyOver = false; PouetHunterGame.AlreadyCollectedScraps.Clear(); } public static void ResetGame(bool resetWelcomePlayer = true) { if (resetWelcomePlayer) { PouetHunterGame.welcomedPlayers.Clear(); PouetHunterGame.playersColor.Clear(); } PouetHunterGame.WinsAsHunter.Clear(); PouetHunterGame.WinsAsPouet.Clear(); PouetHunterGame.numRound = 1; ResetRound(); PouetHunterGame.Logger.LogInfo((object)"The Game has been reset"); } public static void UnlockAllDoors() { IEnumerable<DoorLock> enumerable = from x in Object.FindObjectsOfType<DoorLock>() where x.isLocked select x; int num = 0; foreach (DoorLock item in enumerable) { item.UnlockDoorSyncWithServer(); num++; } PouetHunterGame.Logger.LogInfo((object)(num + " doors have been Unlocked")); } public static void DisplayScoreBoard() { HUDManager instance = HUDManager.Instance; if (instance != null) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("<color=white>[</color><color=#FFC000>Scoreboard</color><color=white>]</color>\n"); PlayerControllerB[] players = PouetHunterGame.players; foreach (PlayerControllerB val in players) { string playerUsername = val.playerUsername; int num = (PouetHunterGame.WinsAsHunter.ContainsKey(playerUsername) ? PouetHunterGame.WinsAsHunter[playerUsername] : 0); int num2 = (PouetHunterGame.WinsAsPouet.ContainsKey(playerUsername) ? PouetHunterGame.WinsAsPouet[playerUsername] : 0); stringBuilder.Append($"<color={ColorManager.GetPlayerColor(val)}>{playerUsername}</color><color=white> : {num}</color><color=#FF0000>H</color><color=white> | {num2}</color><color=#D86ECC>P</color>\n"); } instance.AddTextToChatOnServer(stringBuilder.ToString(), -1); } } public static void DisplayBeginingRoundMessage() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append("<color=white>[</color><color=#D86ECC>Pouet</color><color=#FF0000>Hunter</color><color=#FFC000>Game</color><color=white>]\n"); stringBuilder.Append($"<color=white>[</color><color=#FFC000>Manche {PouetHunterGame.numRound}/{PouetHunterGame.TotalRounds.Value}</color><color=white>]</color>\n"); stringBuilder.Append("Scrap à trouver :</color><color=#24A5FC>\n" + PouetHunterGame.scrapChosenName + "</color>\n"); stringBuilder.Append("<color=white>Nombre :</color><color=#24A5FC>\n" + PouetHunterGame.NbScraps.Value + "</color>\n"); stringBuilder.Append("<color=white>Heure Début-Fin :</color>\n<color=#24A5FC>" + PouetHunterGame.StartingHour.Value + "H</color><color=white> - </color><color=#24A5FC>" + PouetHunterGame.EndingHour.Value + "H</color>"); HUDManager.Instance.AddTextToChatOnServer(stringBuilder.ToString(), -1); } public static void UnlockAllSuitsAndSignalTranslator() { int[] array = new int[8] { 0, 1, 2, 3, 17, 24, 25, 26 }; int[] array2 = array; foreach (int num in array2) { UnlockableItem val = StartOfRound.Instance.unlockablesList.unlockables[num]; if (!val.alreadyUnlocked) { StartOfRound.Instance.BuyShipUnlockableServerRpc(num, Object.FindObjectOfType<Terminal>().groupCredits); PouetHunterGame.Logger.LogInfo((object)(val.unlockableName + " has been unlock")); } } } public static void HideShipObjectWithID(int id, Vector3 position) { //IL_0073: 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) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //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_00ac: 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_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) PlaceableShipObject val = ((IEnumerable<PlaceableShipObject>)Object.FindObjectsOfType<PlaceableShipObject>()).FirstOrDefault((Func<PlaceableShipObject, bool>)((PlaceableShipObject x) => x.unlockableID == id)); if (val == null) { PouetHunterGame.Logger.LogError((object)"Object not found"); return; } if (val.parentObject == null) { PouetHunterGame.Logger.LogError((object)"Object Parent is null"); return; } NetworkObjectReference val2 = NetworkObjectReference.op_Implicit(((Component)val.parentObject).GetComponent<NetworkObject>()); ShipBuildModeManager instance = ShipBuildModeManager.Instance; Quaternion rotation = ((Component)val).transform.rotation; instance.PlaceShipObject(position, ((Quaternion)(ref rotation)).eulerAngles, val, false); ShipBuildModeManager instance2 = ShipBuildModeManager.Instance; rotation = ((Component)val).transform.rotation; instance2.PlaceShipObjectServerRpc(position, ((Quaternion)(ref rotation)).eulerAngles, val2, 0); PouetHunterGame.Logger.LogInfo((object)$"Object {id} hidden at {((Component)val).transform.position}"); } public static void ChangeStartingDeadline(int newDeadLine) { TimeOfDay instance = TimeOfDay.Instance; instance.quotaVariables.deadlineDaysAmount = newDeadLine; instance.timeUntilDeadline = (float)(instance.quotaVariables.deadlineDaysAmount + newDeadLine) * instance.totalTime; TimeOfDay.Instance.timeUntilDeadline = (int)(TimeOfDay.Instance.totalTime * (float)TimeOfDay.Instance.quotaVariables.deadlineDaysAmount); TimeOfDay.Instance.SyncTimeClientRpc(instance.globalTime, (int)instance.timeUntilDeadline); ((TMP_Text)StartOfRound.Instance.deadlineMonitorText).text = "DEADLINE:\n " + PouetHunterGame.TotalRounds.Value + " Days"; } public static TerminalNode CreateTerminalNode(string message, bool clearPreviousText = true, int maxChar = 50) { TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>(); val.displayText = message; val.clearPreviousText = clearPreviousText; val.maxCharactersToType = maxChar; return val; } } internal class ScrapSpawningManager { private static readonly HashSet<string> blacklistedChoosenScraps = new HashSet<string> { "clown horn", "shotgun" }; public static void SpawnHunterEquipment(PlayerControllerB player, int shotgunAmount = 1, int ammoAmount = 2) { //IL_00e0: Unknown result type (might be due to invalid IL or missing references) if (player == null || player.isPlayerDead) { return; } Vector3 spawnPosition = default(Vector3); ((Vector3)(ref spawnPosition))..ctor(4f, 5f, -14f); List<ObjectToSpawn> list = new List<ObjectToSpawn> { new ObjectToSpawn(59, 1.15f, 0, shotgunAmount), new ObjectToSpawn(60, 1f, 0, ammoAmount) }; if (PouetHunterGame.SpawnBeltbagForHunters.Value) { list.Add(new ObjectToSpawn(79, 1.15f, 0, 1)); } if (PouetHunterGame.SpawnMapperForHunters.Value && TimeOfDay.Instance.hour + 6 >= PouetHunterGame.EndingHour.Value - 2) { list.Add(new ObjectToSpawn(8, 1f, 0, 1)); } foreach (ObjectToSpawn item in list) { SpawnObject(item, spawnPosition); } } public static void SpawnPouetsEquipment() { //IL_002d: 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) Vector3 spawnPosition = default(Vector3); ((Vector3)(ref spawnPosition))..ctor(4f, 5f, -14f); int amount = PouetHunterGame.players.Length; SpawnObject(new ObjectToSpawn(25, 1f, 0, amount), spawnPosition); if (PouetHunterGame.SpawnJetpack.Value) { SpawnObject(new ObjectToSpawn(4, 1.5f, 0, amount), spawnPosition); } } public static void SpawnObject(ObjectToSpawn o, Vector3 spawnPosition) { //IL_0028: 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_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < o.Amount; i++) { GameObject val = Object.Instantiate<GameObject>(StartOfRound.Instance.allItemsList.itemsList[o.Index].spawnPrefab, spawnPosition, Quaternion.identity); ScanNodeProperties val2 = val.GetComponent<ScanNodeProperties>() ?? val.AddComponent<ScanNodeProperties>(); val2.scrapValue = o.Value; val2.subText = $"Value: ${o.Value}"; GrabbableObject component = val.GetComponent<GrabbableObject>(); component.fallTime = 0f; component.scrapValue = o.Value; if (o.Weight != -1f) { component.itemProperties.weight = o.Weight; } component.itemProperties.creditsWorth = o.Value; component.SetScrapValue(o.Value); val.GetComponent<NetworkObject>().Spawn(false); ManualLogSource logger = PouetHunterGame.Logger; string itemName = val.gameObject.GetComponent<GrabbableObject>().itemProperties.itemName; Vector3 val3 = spawnPosition; logger.LogInfo((object)("Spawning scrap " + itemName + " at " + ((object)(Vector3)(ref val3)).ToString())); } } public static void DespawnScrapsInShip(bool despawnEverything = true, string scrapName = "") { StartOfRound instance = StartOfRound.Instance; object obj2; if (instance == null) { obj2 = null; } else { Transform elevatorTransform = instance.elevatorTransform; obj2 = ((elevatorTransform != null) ? ((Component)elevatorTransform).gameObject : null); } GameObject val = (GameObject)obj2; if (val == null) { PouetHunterGame.Logger.LogError((object)"Ship not found"); return; } List<GrabbableObject> list = (from obj in val.GetComponentsInChildren<GrabbableObject>() where !(obj is RagdollGrabbableObject) && !obj.isHeld select obj).ToList(); foreach (GrabbableObject item in list) { if (despawnEverything || item.itemProperties.itemName.Equals(scrapName)) { DespawnScraps(item); } } } public static void DespawnScraps(GrabbableObject scrapToDespawn) { NetworkObject component = ((Component)scrapToDespawn).gameObject.GetComponent<NetworkObject>(); if ((Object)(object)component != (Object)null && component.IsSpawned && !scrapToDespawn.isHeld) { PouetHunterGame.Logger.LogInfo((object)("Despawning scrap : " + scrapToDespawn.itemProperties.itemName)); Object.Destroy((Object)(object)((Component)scrapToDespawn).gameObject); } } public static void DespawnAllScrapsRemaining() { List<GrabbableObject> list = (from obj in Object.FindObjectsOfType<GrabbableObject>() where !(obj is RagdollGrabbableObject) && !obj.isHeld select obj).ToList(); foreach (GrabbableObject item in list) { DespawnScraps(item); } } public static void SpawnMapperForHunters() { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) foreach (PlayerControllerB item in PouetHunterGame.hunters.Where((PlayerControllerB x) => !x.isPlayerDead)) { Vector3 position = ((Component)item).transform.position; SpawnObject(new ObjectToSpawn(8, 1f, 0, 1), position); PouetHunterGame.Logger.LogInfo((object)$"Spawning Mapper for {item.playerUsername} at {position}"); } } public static void SelectAndSpawnChosenScraps() { SelectChosenScrap(); SpawnChosenScrap(); PouetHunterGame.Logger.LogInfo((object)$"Spawning {PouetHunterGame.NbScraps.Value} {PouetHunterGame.scrapChosenName}"); } public static void SelectChosenScrap() { HashSet<string> allScrapsInLevel = (from x in Object.FindObjectsOfType<GrabbableObject>() where x.isInFactory && x.itemProperties.isScrap select x.itemProperties.itemName.ToLower()).ToHashSet(); List<string> list = (from x in StartOfRound.Instance.allItemsList.itemsList where !allScrapsInLevel.Contains(x.itemName.ToLower()) && x.isScrap && !IsBlacklistedScrap(x.itemName) && AllowTwoHanded(x) select x.itemName).ToList(); PouetHunterGame.scrapChosenName = list[Random.Range(0, list.Count)]; } public static void SpawnChosenScrap() { //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) RoundManager instance = RoundManager.Instance; Item val = ((IEnumerable<Item>)StartOfRound.Instance.allItemsList.itemsList).FirstOrDefault((Func<Item, bool>)((Item x) => x.itemName.Equals(PouetHunterGame.scrapChosenName, StringComparison.OrdinalIgnoreCase))); if (val == null) { PouetHunterGame.Logger.LogError((object)(PouetHunterGame.scrapChosenName + " not found in itemsList")); return; } List<RandomScrapSpawn> list = (from spawn in Object.FindObjectsOfType<RandomScrapSpawn>() where !spawn.spawnUsed select spawn).ToList(); Random anomalyRandom = instance.AnomalyRandom; List<NetworkObjectReference> list2 = new List<NetworkObjectReference>(); List<int> list3 = new List<int>(); for (int i = 0; i < PouetHunterGame.NbScraps.Value; i++) { if (list.Count == 0) { PouetHunterGame.Logger.LogError((object)"No Spawnpoint available"); break; } RandomScrapSpawn val2 = list[anomalyRandom.Next(list.Count)]; list.Remove(val2); val2.spawnUsed = true; Vector3 val3 = (val2.spawnedItemsCopyPosition ? ((Component)val2).transform.position : (instance.GetRandomNavMeshPositionInBoxPredictable(((Component)val2).transform.position, val2.itemSpawnRange, instance.navHit, anomalyRandom, -1, 1f) + Vector3.up * val.verticalOffset)); GameObject val4 = Object.Instantiate<GameObject>(val.spawnPrefab, val3, Quaternion.identity, instance.spawnedScrapContainer); GrabbableObject component = val4.GetComponent<GrabbableObject>(); ((Component)component).transform.rotation = Quaternion.Euler(component.itemProperties.restingRotation); component.fallTime = 0f; int item = (component.scrapValue = anomalyRandom.Next(val.minValue, val.maxValue)); NetworkObject component2 = val4.GetComponent<NetworkObject>(); component2.Spawn(false); list2.Add(NetworkObjectReference.op_Implicit(component2)); list3.Add(item); } ((MonoBehaviour)instance).StartCoroutine(WaitForChosenScrapsToSpawnToSync(list2.ToArray(), list3.ToArray())); } public static bool IsBlacklistedScrap(string scrapName) { return blacklistedChoosenScraps.Contains(scrapName.ToLower()); } public static IEnumerator WaitForChosenScrapsToSpawnToSync(NetworkObjectReference[] spawnedScrap, int[] scrapValues) { yield return (object)new WaitForSeconds(11f); RoundManager.Instance.SyncScrapValuesClientRpc(spawnedScrap, scrapValues); } public static bool AllowTwoHanded(Item item) { if (item == null) { return false; } return PouetHunterGame.CanChosenScrapBeTwoHanded.Value || item.twoHanded; } } } namespace PouetHunterGame.Patches { [HarmonyPatch(typeof(CentipedeAI))] internal class CentipedeAIPatch { [HarmonyPatch("ClingToPlayer")] [HarmonyPostfix] public static void ClingToPlayer_Postfix(CentipedeAI __instance, PlayerControllerB playerScript) { __instance.StopClingingServerRpc(false); } } [HarmonyPatch(typeof(EnemyAI))] internal class EnemyAIPatch { [HarmonyPatch("SwitchToBehaviourState")] [HarmonyPrefix] public static bool SwitchToBehaviourState_Prefix(EnemyAI __instance, ref int stateIndex) { if (__instance is JesterAI && ((NetworkBehaviour)__instance).IsHost) { stateIndex = 0; } return true; } } [HarmonyPatch(typeof(GameNetworkManager))] internal class GameNetworkManagerPatch { [HarmonyPatch("SteamMatchmaking_OnLobbyCreated")] [HarmonyPrefix] public static void SteamMatchmaking_OnLobbyCreated_Prefix() { GameUtils.ResetGame(); } } [HarmonyPatch(typeof(GrabbableObject))] internal class GrabbableObjectPatch { [HarmonyPatch("OnBroughtToShip")] [HarmonyPostfix] public static void OnBroughtToShip_Postfix(ref GrabbableObject __instance) { string itemName = __instance.itemProperties.itemName; if (itemName == null || !itemName.Equals(PouetHunterGame.scrapChosenName, StringComparison.OrdinalIgnoreCase)) { return; } if (PouetHunterGame.AlreadyCollectedScraps.Contains(__instance)) { PouetHunterGame.Logger.LogError((object)"This Scrap has already been collected"); return; } PouetHunterGame.AlreadyCollectedScraps.Add(__instance); PlayerControllerB playerHeldBy = __instance.playerHeldBy; if (playerHeldBy == null) { PouetHunterGame.Logger.LogError((object)("Nobody is holding : " + __instance.itemProperties.itemName)); return; } if (!PouetHunterGame.hunters.Contains(playerHeldBy)) { PouetHunterGame.hunters.Add(playerHeldBy); PouetHunterGame.Logger.LogInfo((object)("Adding to hunters : " + playerHeldBy.playerUsername)); if (!PouetHunterGame.WinsAsHunter.ContainsKey(playerHeldBy.playerUsername)) { PouetHunterGame.WinsAsHunter.Add(playerHeldBy.playerUsername, 1); } else { PouetHunterGame.WinsAsHunter[playerHeldBy.playerUsername]++; } if (PouetHunterGame.DisplayNewHunterName.Value) { HUDManager.Instance.UseSignalTranslatorServerRpc("H->" + playerHeldBy.playerUsername); } } ScrapSpawningManager.SpawnHunterEquipment(playerHeldBy, PouetHunterGame.ShotgunAmount.Value, PouetHunterGame.AmmoAmount.Value); } } [HarmonyPatch(typeof(HUDManager))] internal class HUDManagerPatch { [HarmonyPatch("AddTextMessageClientRpc")] [HarmonyPrefix] public static bool AddTextMessageClientRpc_Prefix(string chatMessage) { if (chatMessage.Contains("was left behind") || chatMessage.Contains("joined the ship")) { return false; } return true; } [HarmonyPatch("AddPlayerChatMessageClientRpc")] [HarmonyPrefix] public static bool AddPlayerChatMessageClientRpc_Prefix(string chatMessage, int playerId) { Regex regex = new Regex("^/couleur (?<valeurCouleur>.+)$"); Match match = regex.Match(chatMessage); if (match.Success) { string text = ColorManager.SetNewColorForPlayer(StartOfRound.Instance.allPlayerScripts[playerId], match.Groups["valeurCouleur"].Value); PouetHunterGame.Logger.LogInfo((object)(StartOfRound.Instance.allPlayerScripts[playerId].playerUsername + " color is now : " + text)); return false; } return true; } [HarmonyPatch("ApplyPenalty")] [HarmonyPrefix] public static bool ApplyPenalty_Prefix(int playersDead, int bodiesInsured) { Terminal val = Object.FindFirstObjectByType<Terminal>(); if (val == null) { PouetHunterGame.Logger.LogError((object)"Terminal is null"); return false; } val.SyncGroupCreditsServerRpc(100000, 0); PouetHunterGame.Logger.LogInfo((object)"Setting new group credits to 100 000"); return false; } } [HarmonyPatch(typeof(MeteorShowers))] internal class MeteorShowersPatch { [HarmonyPatch("BeginDay")] [HarmonyPrefix] public static bool BeginDay_Prefix(ref MeteorShowers __instance, float timeOfDay) { if (!((NetworkBehaviour)__instance).IsServer) { return false; } __instance.meteors.Clear(); HUDManager.Instance.MeteorShowerWarningHUD(); TimeOfDay.Instance.SetBeginMeteorShowerClientRpc(); __instance.meteorsEnabled = true; return false; } [HarmonyPatch("Update")] [HarmonyPrefix] public static bool Update_Prefix(MeteorShowers __instance) { //IL_006a: 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_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_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown if (!TimeOfDay.Instance.timeHasStarted || !StartOfRound.Instance.shipDoorsEnabled || !__instance.meteorsEnabled) { return false; } for (int i = 0; i < PouetHunterGame.players.Length; i++) { if (__instance.meteors.Count <= 3 && CanBeMeteorited(PouetHunterGame.players[i])) { Vector3 position = ((Component)PouetHunterGame.players[i]).transform.position; Meteor item = new Meteor { scale = 10f, landingPosition = position, skyDirection = Vector3.up * 0.1f, normalizedLandingTime = Mathf.Clamp(TimeOfDay.Instance.normalizedTimeOfDay, 0f, 0.99f) }; __instance.meteors.Add(item); PouetHunterGame.Logger.LogInfo((object)("Summoning Meteor on " + PouetHunterGame.players[i].playerUsername)); if (__instance.meteors.Count >= 4) { break; } } } foreach (Meteor meteor in __instance.meteors) { __instance.MeteorUpdate(meteor); } return false; } private static bool CanBeMeteorited(PlayerControllerB player) { return !player.isPlayerDead && !player.isInsideFactory && !PouetHunterGame.hunters.Contains(player) && !GameUtils.IsPlayerHolding(player, PouetHunterGame.scrapChosenName); } } [HarmonyPatch(typeof(RoundManager))] internal class RoundManagerPatch { [HarmonyPatch("SpawnMapObjects")] [HarmonyPostfix] public static void SpawnMapObjects_Postfix(RoundManager __instance) { GameUtils.ResetRound(); ScrapSpawningManager.SelectAndSpawnChosenScraps(); GameUtils.ClearChat(); GameUtils.DisplayBeginingRoundMessage(); ScrapSpawningManager.SpawnPouetsEquipment(); } [HarmonyPatch("ShowStaticElectricityWarningServerRpc")] [HarmonyPrefix] public static bool ShowStaticElectricityWarningServerRpc_Prefix(NetworkObjectReference warningObject, float timeLeft) { return false; } [HarmonyPatch("LightningStrikeServerRpc")] [HarmonyPrefix] public static bool LightningStrikeServerRpc_Prefix(Vector3 strikePosition) { return false; } [HarmonyPatch("LoadNewLevel")] [HarmonyPrefix] public static bool LoadNewLevel_Prefix(ref SelectableLevel newLevel) { if (!PouetHunterGame.MonstersInside.Value) { foreach (SpawnableEnemyWithRarity enemy in newLevel.Enemies) { enemy.rarity = 0; } PouetHunterGame.Logger.LogInfo((object)"Entities Inside removed"); } if (!PouetHunterGame.MonstersOutside.Value) { foreach (SpawnableEnemyWithRarity outsideEnemy in newLevel.OutsideEnemies) { outsideEnemy.rarity = 0; } PouetHunterGame.Logger.LogInfo((object)"Entities Outside removed"); } return true; } } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatch { [HarmonyPatch("StartTrackingAllPlayerVoices")] [HarmonyPostfix] public static void StartTrackingAllPlayerVoices_Postfix() { if (!((NetworkBehaviour)StartOfRound.Instance.localPlayerController).IsHost) { return; } PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; PlayerControllerB[] array = allPlayerScripts; foreach (PlayerControllerB val in array) { if (val.isPlayerControlled && !PouetHunterGame.welcomedPlayers.Contains(val.actualClientId)) { PouetHunterGame.welcomedPlayers.Add(val.actualClientId); string randomHexColor = ColorManager.GetRandomHexColor(); PouetHunterGame.playersColor.Add(val.playerUsername, randomHexColor); string text = "<color=white>[</color><color=#D86ECC>Pouet</color><color=#FF0000>Hunter</color><color=#FFC000>Game</color><color=white>] Bienvenue à bord </color><color=" + randomHexColor + ">" + val.playerUsername + "</color><color=white>.</color>"; HUDManager.Instance.AddTextToChatOnServer(text, -1); } } } [HarmonyPatch("Start")] [HarmonyPostfix] public static void Start_Postfix() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) GameUtils.UnlockAllSuitsAndSignalTranslator(); GameUtils.HideShipObjectWithID(17, new Vector3(2f, -5f, -14f)); GameUtils.ChangeStartingDeadline(PouetHunterGame.TotalRounds.Value); } [HarmonyPatch("EndOfGame")] [HarmonyPostfix] public static void EndOfGame_Postfix(ref StartOfRound __instance, int bodiesInsured = 0, int connectedPlayersOnServer = 0, int scrapCollected = 0) { ScrapSpawningManager.DespawnAllScrapsRemaining(); GameUtils.DisplayScoreBoard(); } [HarmonyPatch("Update")] [HarmonyPostfix] public static void Update_Postfix() { //IL_045a: Unknown result type (might be due to invalid IL or missing references) PouetHunterGame.players = (from x in Object.FindObjectsOfType<PlayerControllerB>() where x.isPlayerControlled || x.isPlayerDead select x).ToArray(); if (GameOverManager.IsGameOver() && !PouetHunterGame.GameAlreadyOver) { GameUtils.ClearChat(); HUDManager.Instance.AddTextToChatOnServer("<color=white>[</color><color=#FFC000>Manche Terminée</color><color=white>]</color>", -1); PouetHunterGame.GameAlreadyOver = true; StringBuilder stringBuilder = new StringBuilder(); if (StartOfRound.Instance.allPlayersDead) { stringBuilder.Append("<color=#FF0000>Pas de gagnant !</color>"); } else { TimeOfDay.Instance.SetShipLeaveEarlyClientRpc(TimeOfDay.Instance.normalizedTimeOfDay, 4); if (PouetHunterGame.HuntersWon) { stringBuilder.Append("<color=white>Victoire des </color><color=#FF0000>Hunters</color><color=white>:</color>\n"); foreach (PlayerControllerB hunter in PouetHunterGame.hunters) { stringBuilder.Append("<color=" + ColorManager.GetPlayerColor(hunter) + ">" + hunter.playerUsername + "</color>\n"); if (!hunter.isPlayerDead) { if (!PouetHunterGame.WinsAsHunter.ContainsKey(hunter.playerUsername)) { PouetHunterGame.WinsAsHunter.Add(hunter.playerUsername, 1); } else { PouetHunterGame.WinsAsHunter[hunter.playerUsername]++; } } } } else { stringBuilder.Append("<color=white>Victoire des </color><color=#D86ECC>Pouets</color><color=white>:\n"); foreach (PlayerControllerB item in PouetHunterGame.players.Where((PlayerControllerB x) => !x.isPlayerDead)) { if (!PouetHunterGame.hunters.Contains(item)) { stringBuilder.Append("<color=" + ColorManager.GetPlayerColor(item) + ">" + item.playerUsername + "</color>\n"); if (!PouetHunterGame.WinsAsPouet.ContainsKey(item.playerUsername)) { PouetHunterGame.WinsAsPouet.Add(item.playerUsername, 1); } else { PouetHunterGame.WinsAsPouet[item.playerUsername]++; } } } } } if (!PouetHunterGame.HuntersWon && PouetHunterGame.hunters.Count > 0) { stringBuilder.Append("<color=white>[</color><color=#FF0000>Hunters</color><color=white>]</color>\n"); foreach (PlayerControllerB hunter2 in PouetHunterGame.hunters) { stringBuilder.Append("<color=" + ColorManager.GetPlayerColor(hunter2) + ">" + hunter2.playerUsername + "</color>\n"); } } HUDManager.Instance.AddTextToChatOnServer(stringBuilder.ToString(), -1); ((MonoBehaviour)StartOfRound.Instance).StartCoroutine(GameOverManager.KillRemainingPlayerWithDelay()); } if (!TimeOfDay.Instance.timeHasStarted || TimeOfDay.Instance.hour < GameUtils.GetValidHour(PouetHunterGame.StartingHour.Value, 9, 23)) { return; } foreach (PlayerControllerB item2 in PouetHunterGame.players.Where((PlayerControllerB x) => !x.isPlayerDead)) { if (!PouetHunterGame.hunters.Contains(item2) && item2.isInsideFactory && !GameUtils.IsPlayerHolding(item2, "Clown horn")) { PouetHunterGame.Logger.LogInfo((object)("Trying to kill " + item2.playerUsername + " ID : " + item2.actualClientId)); item2.DamagePlayerFromOtherClientServerRpc(200, Vector3.zero, 0); } } } [HarmonyPatch("OnClientDisconnect")] [HarmonyPrefix] public static void OnClientDisconnect_Prefix(ulong clientId) { PouetHunterGame.welcomedPlayers.Remove(clientId); string text = StartOfRound.Instance.allPlayerScripts.Where((PlayerControllerB x) => x.actualClientId.Equals(clientId)).First()?.playerUsername; if (text != null) { PouetHunterGame.playersColor.Remove(text); } } [HarmonyPatch("EndGameServerRpc")] [HarmonyPrefix] public static bool EndGameServerRpc_Prefix(int playerClientId) { return false; } [HarmonyPatch("BuyShipUnlockableServerRpc")] [HarmonyPrefix] public static bool BuyShipUnlockableServerRpc_Prefix(int unlockableID, int newGroupCreditsAmount) { if (unlockableID == 5) { return false; } return true; } [HarmonyPatch("ResetShip")] [HarmonyPostfix] public static void ResetShip_Postfix() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) GameUtils.UnlockAllSuitsAndSignalTranslator(); GameUtils.HideShipObjectWithID(17, new Vector3(2f, -5f, -14f)); GameUtils.ClearChat(); GameOverManager.DisplaysWinners(); GameUtils.ResetGame(resetWelcomePlayer: false); Terminal val = Object.FindObjectOfType<Terminal>(); if (val == null) { PouetHunterGame.Logger.LogError((object)"Terminal not found"); return; } val.SyncGroupCreditsServerRpc(100000, 0); PouetHunterGame.Logger.LogInfo((object)"Setting new group credits to 100 000"); TimeOfDay.Instance.SyncTimeClientRpc(TimeOfDay.Instance.globalTime, (int)TimeOfDay.Instance.timeUntilDeadline); } } [HarmonyPatch(typeof(Terminal))] internal class TerminalPatch { [HarmonyPatch("Start")] [HarmonyPostfix] public static void Start_Postfix(Terminal __instance, ref TerminalNodesList ___terminalNodes) { __instance.SyncGroupCreditsServerRpc(100000, 0); PouetHunterGame.Logger.LogInfo((object)"Setting new group credits to 100 000"); int index = 1; string displayText = ___terminalNodes.specialNodes[index].displayText; string displayText2 = (displayText += "\n[PouetHunterGame]\nEntrez \"phg <nombre>\" pour changer le nombre de manche et recommencer la partie\nEntrez \"phg fin\" pour terminer la partie prématurément\n"); ___terminalNodes.specialNodes[index].displayText = displayText2; } [HarmonyPatch("ParsePlayerSentence")] [HarmonyPrefix] [HarmonyPriority(800)] private static bool ParsePlayerSentencePatch(Terminal __instance, ref TerminalNode __result) { string text = __instance.screenText.text.Substring(__instance.screenText.text.Length - __instance.textAdded); if (text.Contains("phg fin")) { StartOfRound.Instance.ResetShip(); __result = GameUtils.CreateTerminalNode("La partie a été réinitialisée \ud83d\ude01"); return false; } Match match = Regex.Match(text, "phg\\s+(-?\\d+)", RegexOptions.IgnoreCase); if (match.Success) { int num = int.Parse(match.Groups[1].Value); if (num < 1 || num > 10) { __result = GameUtils.CreateTerminalNode($"{num} n'est pas une valeur valide.\nVeuillez saisir une valeur entre 1 et 10"); return false; } PouetHunterGame.TotalRounds.Value = num; GameUtils.ChangeStartingDeadline(PouetHunterGame.TotalRounds.Value); StartOfRound.Instance.ResetShip(); __result = GameUtils.CreateTerminalNode($"Nombre de manche : {PouetHunterGame.TotalRounds.Value}\nPartie réinitialisée !"); return false; } return true; } } [HarmonyPatch(typeof(TimeOfDay))] internal class TimeOfDayPatch { [HarmonyPatch("DecideRandomDayEvents")] [HarmonyPrefix] public static bool DecideRandomDayEvents_Prefix() { return false; } [HarmonyPatch("MoveTimeOfDay")] [HarmonyPostfix] public static void MoveTimeOfDay_Postfix(TimeOfDay __instance) { if (__instance.hour >= GameUtils.GetValidHour(PouetHunterGame.StartingHour.Value, 9, 23) && !__instance.MeteorWeather.meteorsEnabled) { __instance.MeteorWeather.SetStartMeteorShower(); GameUtils.UnlockAllDoors(); } } [HarmonyPatch("SetShipLeaveEarlyServerRpc")] [HarmonyPrefix] public static bool SetShipLeaveEarlyServerRpc_Prefix() { return false; } [HarmonyPatch("OnHourChanged")] [HarmonyPrefix] public static void OnHourChanged_Prefix(TimeOfDay __instance) { int num = __instance.hour + 6; if (num > 8 && num < PouetHunterGame.EndingHour.Value && num % 4 == 0) { HUDManager.Instance.UseSignalTranslatorServerRpc($"{num} Heures"); } if (PouetHunterGame.SpawnMapperForHunters.Value && num == PouetHunterGame.EndingHour.Value - 2) { ScrapSpawningManager.SpawnMapperForHunters(); HUDManager.Instance.UseSignalTranslatorServerRpc("H->Mapper"); } } [HarmonyPatch("OnDayChanged")] [HarmonyPostfix] public static void OnDayChanged_Postfix(TimeOfDay __instance) { PouetHunterGame.numRound++; if (__instance.daysUntilDeadline == 0) { if (((NetworkBehaviour)__instance).IsServer) { GameNetworkManager.Instance.ResetSavedGameValues(); } StartOfRound.Instance.ResetShip(); } } } } namespace PouetHunterGame.Object { internal class CouleursToHEX { public static readonly Dictionary<string, string> CouleursHEX = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase) { { "rouge", "#FF0000" }, { "vert", "#00FF00" }, { "bleu", "#0000FF" }, { "blanc", "#FFFFFF" }, { "noir", "#000000" }, { "jaune", "#FFFF00" }, { "cyan", "#00FFFF" }, { "magenta", "#FF00FF" }, { "gris", "#808080" }, { "orange", "#FFA500" }, { "rose", "#FFC0CB" }, { "violet", "#800080" }, { "marron", "#A52A2A" }, { "turquoise", "#40E0D0" }, { "beige", "#F5F5DC" }, { "bordeaux", "#800000" }, { "lavande", "#E6E6FA" }, { "ivoire", "#FFFFF0" }, { "sable", "#F4A460" }, { "menthe", "#98FF98" }, { "pêche", "#FFDAB9" }, { "prune", "#DDA0DD" }, { "corail", "#FF7F50" }, { "indigo", "#4B0082" }, { "chocolat", "#D2691E" }, { "ardoise", "#708090" }, { "abricot", "#FBCEB1" }, { "aigue-marine", "#7FFFD4" }, { "améthyste", "#9966CC" }, { "anthracite", "#293133" }, { "azur", "#007FFF" }, { "bleu ciel", "#87CEEB" }, { "bleu roi", "#002366" }, { "carmin", "#960018" }, { "cerise", "#DE3163" }, { "chartreuse", "#7FFF00" }, { "cuivre", "#B87333" }, { "émeraude", "#50C878" }, { "framboise", "#E30B5C" }, { "fuchsia", "#FF00FF" }, { "jade", "#00A86B" }, { "kaki", "#F0E68C" }, { "lavande foncée", "#734F96" }, { "lime", "#BFFF00" }, { "lin", "#FAF0E6" }, { "marine", "#000080" }, { "moutarde", "#FFDB58" }, { "nacré", "#FDFD96" }, { "ocre", "#CC7722" }, { "olive", "#808000" }, { "or", "#FFD700" }, { "perle", "#EAE0C8" }, { "rose bonbon", "#FF69B4" }, { "rouille", "#B7410E" }, { "safran", "#F4C430" }, { "saphir", "#0F52BA" }, { "saumon", "#FA8072" }, { "sépia", "#704214" }, { "tomate", "#FF6347" }, { "vert forêt", "#228B22" }, { "vert pomme", "#8DB600" }, { "vert sapin", "#014421" }, { "violacé", "#6A5ACD" } }; } internal class ObjectToSpawn { public int Index { get; set; } public float Weight { get; set; } public int Value { get; set; } public int Amount { get; set; } public ObjectToSpawn(int index, float weight, int value, int amount) { Index = index; Weight = weight; Value = value; Amount = amount; } } }