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 LethalStatsLC v2.0.1
OrianaGames-Stats/LethalProgression.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using Inputs; using LethalCompanyInputUtils.Api; using LethalNetworkAPI; using LethalProgression; using LethalProgression.Config; using LethalProgression.GUI; using LethalProgression.Network; using LethalProgression.Patches; using LethalProgression.Properties; using LethalProgression.Saving; using LethalProgression.Skills; using LethalProgression.Utils; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using NightVision.Patches; using Steamworks; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.Rendering.HighDefinition; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("LethalProgression")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Lethal Progression FR Version Orianagames")] [assembly: AssemblyFileVersion("0.0.0.0")] [assembly: AssemblyInformationalVersion("0.0.0-alpha.0")] [assembly: AssemblyProduct("LethalProgression")] [assembly: AssemblyTitle("LethalProgression")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } public class LC_XP_WisdomHandler : MonoBehaviour { private PlayerControllerB player; private float previousWisdom = -1f; private void Start() { player = ((Component)this).GetComponent<PlayerControllerB>(); } private void Update() { if (!NetworkManager.Singleton.IsServer || (Object)(object)player == (Object)null || player.playerClientId != NetworkManager.Singleton.LocalClientId) { return; } float num = 0f; if ((Object)(object)LP_NetworkManager.xpInstance != (Object)null && LP_NetworkManager.xpInstance.skillList != null && LP_NetworkManager.xpInstance.skillList.skills.ContainsKey(UpgradeType.Wisdom)) { num = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Wisdom].GetTrueValue(); } if (Mathf.Abs(num - previousWisdom) > 0.01f) { previousWisdom = num; if ((Object)(object)LP_NetworkManager.xpWisdomInstance != (Object)null) { LP_NetworkManager.xpWisdomInstance.SetWisdomLevel((int)player.playerClientId, num); Debug.Log((object)$"[WisdomSync] Updated Wisdom for player {player.playerClientId} → {num:F2}"); } } } } public class WAV { public float[] LeftChannel; public int ChannelCount; public int SampleCount; public int Frequency; public WAV(byte[] wav) { ChannelCount = wav[22]; Frequency = BytesToInt(wav, 24); int i; for (i = 12; wav[i] != 100 || wav[i + 1] != 97 || wav[i + 2] != 116 || wav[i + 3] != 97; i += 4) { } i += 8; SampleCount = (wav.Length - i) / 2; LeftChannel = new float[SampleCount]; int num = 0; while (i < wav.Length) { short num2 = (short)((wav[i + 1] << 8) | wav[i]); LeftChannel[num] = (float)num2 / 32768f; i += 2; num++; } } private int BytesToInt(byte[] bytes, int offset) { return (bytes[offset + 3] << 24) | (bytes[offset + 2] << 16) | (bytes[offset + 1] << 8) | bytes[offset]; } } namespace NightVision { public static class NightVisionAudioLoader { public static AudioClip LoadWav(string name) { string text = Path.Combine(Paths.PluginPath, "OrianaGames-LethalStatsLC", name + ".wav"); if (!File.Exists(text)) { Debug.LogWarning((object)("[NightVision] File not found: " + text)); return null; } try { byte[] wav = File.ReadAllBytes(text); WAV wAV = new WAV(wav); AudioClip val = AudioClip.Create(name, wAV.SampleCount, 1, wAV.Frequency, false); val.SetData(wAV.LeftChannel, 0); return val; } catch (Exception ex) { Debug.LogError((object)("[NightVision] Failed to load WAV: " + ex.Message)); return null; } } } public class NightVisionAudioManager : MonoBehaviour { public static NightVisionAudioManager Instance; private AudioSource source; private AudioClip clipOn; private AudioClip clipOff; private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)((Component)this).gameObject); return; } Instance = this; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); Debug.Log((object)"[NightVision] AudioManager Awake"); source = ((Component)this).gameObject.AddComponent<AudioSource>(); source.playOnAwake = false; source.volume = 1f; ReloadAudio(); } public void ReloadAudio() { Debug.Log((object)"[NightVision] Reloading audio clips..."); string path = Path.Combine(Paths.PluginPath, "OrianaGames-LethalStatsLC", ""); string path2 = Path.Combine(path, "nightvision_on.wav"); string path3 = Path.Combine(path, "nightvision_off.wav"); if (!File.Exists(path2)) { Debug.LogError((object)"[NightVision] nightvision_on.wav NOT FOUND"); } if (!File.Exists(path3)) { Debug.LogError((object)"[NightVision] nightvision_off.wav NOT FOUND"); } clipOn = NightVisionAudioLoader.LoadWav("nightvision_on"); clipOff = NightVisionAudioLoader.LoadWav("nightvision_off"); Debug.Log((object)("[NightVision] clipOn loaded: " + (((Object)(object)clipOn != (Object)null) ? "✅ OK" : "❌ NULL"))); Debug.Log((object)("[NightVision] clipOff loaded: " + (((Object)(object)clipOff != (Object)null) ? "✅ OK" : "❌ NULL"))); } public void PlayToggle(bool isOn) { if ((Object)(object)clipOn == (Object)null || (Object)(object)clipOff == (Object)null) { Debug.LogWarning((object)"[NightVision] Clips were null at toggle — reloading..."); ReloadAudio(); } AudioClip val = (isOn ? clipOn : clipOff); if ((Object)(object)source != (Object)null && (Object)(object)val != (Object)null) { source.PlayOneShot(val); Debug.Log((object)"[NightVision] Playing toggle sound."); } else { Debug.LogWarning((object)"[NightVision] Cannot play toggle sound — source or clip missing."); } } } } namespace NightVision.Patches { [HarmonyPatch] public static class Nightvision { public static void NightvisionUpdate(int updatedValue) { if (!LP_NetworkManager.xpInstance.skillList.IsSkillListValid() || !LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Nightvision)) { return; } Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Nightvision]; PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController; float trueValue = skill.GetTrueValue(); if (bool.Parse(SkillConfig.hostConfig["Special Ability: Nightvision / Capacité spécial : Vision nocturne"])) { if (int.Parse(SkillConfig.hostConfig["Nightvision Level required / Vision nocturne niveau requis"]) == 0) { PlayerControllerBPatch.NightvisionUnlocked = true; } else if (trueValue >= (float)int.Parse(SkillConfig.hostConfig["Nightvision Level required / Vision nocturne niveau requis"])) { PlayerControllerBPatch.NightvisionUnlocked = true; } else { PlayerControllerBPatch.NightvisionUnlocked = false; } } else { PlayerControllerBPatch.NightvisionUnlocked = false; } } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] internal class PlayerControllerBPatch { public static bool NightvisionEnable = false; public static float NightvisionDuration = 50f; public static float NightvisionCharge = 100f; public static float NightvisionSpeed = 0.35f; public static bool canToggleNightvision = true; public static float lastLoggedCharge = -1f; private static bool lastNightVisionState; public static bool hasCreateAudio = false; public static bool hasLoadedAudio = false; public static bool batteryVisualAttached = false; public static bool NightvisionUnlocked = false; [HarmonyPostfix] private static void UpdatePostfix(PlayerControllerB __instance) { //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Expected O, but got Unknown if ((Object)(object)__instance == (Object)null) { return; } if (StartOfRound.Instance.inShipPhase) { NightvisionEnable = false; } if (GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom) { NightvisionCharge = 100f; } if (GameNetworkManager.Instance.localPlayerController.isInsideFactory) { NightvisionSpeed = 0.125f; } else { NightvisionSpeed = 0.32f; } if (!NightvisionUnlocked) { NightvisionEnable = false; } if (!hasCreateAudio) { GameObject val = new GameObject("NightVisionAudioManager"); Object.DontDestroyOnLoad((Object)(object)val); val.AddComponent<NightVisionAudioManager>(); hasCreateAudio = true; } if (LethalPlugin.Input.Nightvision.triggered) { if (!hasLoadedAudio && (Object)(object)NightVisionAudioManager.Instance != (Object)null) { NightVisionAudioManager.Instance.ReloadAudio(); hasLoadedAudio = true; } if (canToggleNightvision) { canToggleNightvision = false; if (NightvisionEnable) { if (!NightvisionUnlocked) { NightvisionEnable = false; LethalPlugin.Log.LogInfo((object)"\ud83d\udd34 Nightvision locked!"); } else { NightvisionEnable = false; LethalPlugin.Log.LogInfo((object)"\ud83d\udd34 Nightvision manually disabled."); } } else if (NightvisionCharge < 15f) { LethalPlugin.Log.LogInfo((object)"❌ Nightvision use blocked: battery too low (<15%)."); NightVisionAudioManager.Instance?.PlayToggle(isOn: false); } else if (NightvisionUnlocked && !StartOfRound.Instance.inShipPhase) { NightvisionEnable = true; if (NightvisionCharge > 99f) { NightvisionCharge -= 1f; } else { NightvisionCharge -= 5f; } NightvisionCharge = Mathf.Max(NightvisionCharge, 0f); } } } else { canToggleNightvision = true; } if (NightvisionEnable) { NightvisionCharge -= Time.deltaTime * (100f / NightvisionDuration); NightvisionCharge = Mathf.Max(NightvisionCharge, 0f); if (NightvisionCharge <= 0f) { NightvisionEnable = false; LethalPlugin.Log.LogInfo((object)"Nightvision auto-disabled (Battery empty)"); } } else if (NightvisionCharge < 100f) { NightvisionCharge += Time.deltaTime * NightvisionSpeed; NightvisionCharge = Mathf.Min(NightvisionCharge, 100f); } if (NightvisionEnable != lastNightVisionState && NightvisionUnlocked) { lastNightVisionState = NightvisionEnable; NightVisionPatch.ApplyNightVisionEffect(__instance); if (!StartOfRound.Instance.inShipPhase) { NightVisionAudioManager.Instance?.PlayToggle(NightvisionEnable); } NightvisionDuration = Vision.visiondurationvalue; } } } [HarmonyPatch(typeof(PlayerControllerB), "SetNightVisionEnabled")] internal class NightVisionPatch { private struct LightState { public float intensity; public float range; public float shadowStrength; public int shadows; public int shape; public Color color; } private static LightState? savedLightState; [HarmonyPrefix] private static void NightVisionPrefix(PlayerControllerB __instance) { ApplyNightVisionEffect(__instance); } public static void ApplyNightVisionEffect(PlayerControllerB player) { //IL_01af: 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_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected I4, but got Unknown //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Expected I4, but got Unknown //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player == (Object)null || (Object)(object)player.nightVision == (Object)null) { return; } if (PlayerControllerBPatch.NightvisionEnable) { if (!savedLightState.HasValue) { LightState value = default(LightState); value.intensity = player.nightVision.intensity; value.range = player.nightVision.range; value.shadowStrength = player.nightVision.shadowStrength; value.shadows = (int)player.nightVision.shadows; value.shape = (int)player.nightVision.shape; value.color = player.nightVision.color; savedLightState = value; } player.nightVision.intensity = 7500f; player.nightVision.range = 100000f; player.nightVision.shadowStrength = 0f; player.nightVision.shadows = (LightShadows)0; player.nightVision.shape = (LightShape)2; player.nightVision.color = Color.green; } else if (savedLightState.HasValue) { LightState value2 = savedLightState.Value; player.nightVision.intensity = value2.intensity; player.nightVision.range = value2.range; player.nightVision.shadowStrength = value2.shadowStrength; player.nightVision.shadows = (LightShadows)value2.shadows; player.nightVision.shape = (LightShape)value2.shape; player.nightVision.color = value2.color; } } } [HarmonyPatch(typeof(TimeOfDay), "SetInsideLightingDimness")] internal static class NightVisionOutdoors { private struct OutdoorLightState { public float lightDimmer; public float intensity; public float shadowDimmer; public float shadowRadius; public bool useRayTracedShadows; public Color color; } private static OutdoorLightState? saved; private static float sigmoid(float x, float midpoint, float steepness) { return 1f / (1f + Mathf.Exp((0f - steepness) * (x - midpoint))); } [HarmonyPostfix] private static void InsideLightingPostfix(TimeOfDay __instance) { //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_0111: 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_008f: Unknown result type (might be due to invalid IL or missing references) HDAdditionalLightData component = ((Component)__instance.sunIndirect).GetComponent<HDAdditionalLightData>(); if ((Object)(object)component == (Object)null) { return; } if (PlayerControllerBPatch.NightvisionEnable) { if (!saved.HasValue) { OutdoorLightState value = default(OutdoorLightState); value.lightDimmer = component.lightDimmer; value.intensity = component.intensity; value.shadowDimmer = component.shadowDimmer; value.shadowRadius = component.lightShadowRadius; value.useRayTracedShadows = component.useRayTracedShadows; value.color = component.color; saved = value; } float num = 10f; float num2 = sigmoid(__instance.globalTime, 950f, 0.1f); component.lightDimmer = Mathf.Lerp(10f * num, 10000f * num, num2); component.intensity = Mathf.Lerp(num, 1000f * num, num2); component.shadowDimmer = 0f; component.useRayTracedShadows = true; component.lightShadowRadius = 0f; component.color = Color.green; } else if (saved.HasValue) { OutdoorLightState value2 = saved.Value; component.lightDimmer = Mathf.Lerp(component.lightDimmer, value2.lightDimmer, 5f * Time.deltaTime); component.intensity = Mathf.Lerp(component.intensity, value2.intensity, 5f * Time.deltaTime); component.shadowDimmer = value2.shadowDimmer; component.useRayTracedShadows = value2.useRayTracedShadows; component.lightShadowRadius = value2.shadowRadius; component.color = value2.color; } } } } namespace Inputs { public class PluginInput : LcInputActions { [InputAction(/*Could not decode attribute arguments.*/)] public InputAction DoubleJump { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction Nightvision { get; set; } } } namespace LethalProgression { [HarmonyPatch] internal class LP_NetworkManager { public static LC_XP xpInstance; public static LC_XP_Wisdom xpWisdomInstance; public static GameObject xpNetworkObject; [HarmonyPostfix] [HarmonyPatch(typeof(GameNetworkManager), "Start")] public static void Init() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown if (!((Object)(object)xpNetworkObject != (Object)null)) { xpNetworkObject = (GameObject)LethalPlugin.skillBundle.LoadAsset("LP_XPHandler"); if ((Object)(object)xpNetworkObject.GetComponent<LC_XP>() == (Object)null) { xpNetworkObject.AddComponent<LC_XP>(); } if ((Object)(object)xpNetworkObject.GetComponent<LC_XP_Wisdom>() == (Object)null) { xpNetworkObject.AddComponent<LC_XP_Wisdom>(); } NetworkManager.Singleton.AddNetworkPrefab(xpNetworkObject); } } [HarmonyPostfix] [HarmonyPatch(typeof(StartOfRound), "Awake")] private static void SpawnNetworkHandler() { //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) if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { GameObject val = Object.Instantiate<GameObject>(xpNetworkObject, Vector3.zero, Quaternion.identity); val.GetComponent<NetworkObject>().Spawn(false); xpInstance = val.GetComponent<LC_XP>(); xpWisdomInstance = val.GetComponent<LC_XP_Wisdom>(); LethalPlugin.Log.LogInfo((object)"✅ XPHandler & WisdomHandler Initialized."); } } } public class LC_XP_Wisdom : NetworkBehaviour { public Dictionary<int, float> wisdomByPlayerId = new Dictionary<int, float>(); public override void OnNetworkSpawn() { if (!((NetworkBehaviour)this).IsServer) { return; } LethalPlugin.Log.LogInfo((object)"[Wisdom] OnNetworkSpawn - Initializing wisdom dictionary for connected players"); foreach (NetworkClient connectedClients in NetworkManager.Singleton.ConnectedClientsList) { int num = (int)connectedClients.ClientId; if (!wisdomByPlayerId.ContainsKey(num)) { wisdomByPlayerId[num] = 0f; LethalPlugin.Log.LogInfo((object)$"[Wisdom] Added player ID {num} to wisdom dictionary with value 0"); } else { LethalPlugin.Log.LogInfo((object)$"[Wisdom] Player ID {num} already exists in wisdom dictionary with value {wisdomByPlayerId[num]}"); } } LogAllWisdomValues("After OnNetworkSpawn"); } public float GetWisdomLevel(int playerId) { float value; bool flag = wisdomByPlayerId.TryGetValue(playerId, out value); LethalPlugin.Log.LogInfo((object)$"[Wisdom] GetWisdomLevel requested for Player ID {playerId}: exists={flag}, value={value}"); return flag ? value : 0f; } public void SetWisdomLevel(int playerId, float trueValue) { LethalPlugin.Log.LogInfo((object)$"[Wisdom] Setting wisdom for Player ID {playerId} to {trueValue}"); wisdomByPlayerId[playerId] = trueValue; } public void LogAllWisdomValues(string context = "") { if (!((NetworkBehaviour)this).IsServer) { return; } LethalPlugin.Log.LogInfo((object)("[Wisdom] " + context + " - Current wisdom values for all players:")); foreach (KeyValuePair<int, float> item in wisdomByPlayerId) { string arg = "Unknown"; if ((Object)(object)StartOfRound.Instance != (Object)null && item.Key >= 0 && item.Key < StartOfRound.Instance.allPlayerScripts.Length) { PlayerControllerB val = StartOfRound.Instance.allPlayerScripts[item.Key]; if ((Object)(object)val != (Object)null) { arg = val.playerUsername; } } LethalPlugin.Log.LogInfo((object)$"[Wisdom] Player ID {item.Key} ({arg}): {item.Value}"); } } } [BepInPlugin("OrianaGames.LethalStats", "LethalStats", "1.5.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] internal class LethalPlugin : BaseUnityPlugin { private const string modGUID = "OrianaGames.LethalStatsLC"; private const string modName = "LethalStats"; private const string modVersion = "1.5.0"; private const string modAuthor = "Lunastellia"; public static AssetBundle skillBundle; public static AssetBundle UIBundle; public static AssetBundle RadarUIBundle; internal static ManualLogSource Log; internal static bool ReservedSlots; internal static bool MikesTweaks; public static PluginInput Input { get; private set; } public static LethalPlugin Instance { get; private set; } private void Awake() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown Instance = this; Input = new PluginInput(); Harmony val = new Harmony("OrianaGames.LethalStatsLC"); val.PatchAll(); val.PatchAll(typeof(JumpForcePatch)); skillBundle = AssetBundle.LoadFromMemory(Resources.skillmenu); UIBundle = AssetBundle.LoadFromMemory(Resources.nightvision_ui); RadarUIBundle = AssetBundle.LoadFromMemory(Resources.radarui); Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"LethalStats loaded."); string value = ((BaseUnityPlugin)this).Config.Bind<string>("MONSTRES-EXP", "MonsterXPOverrides", "Hoarderbug@15;BaboonHawkEnemy@30;MouthDog@80;Centipede@15;Flowerman@200;SandSpider@60;Crawler@75;MaskedPlayerEnemy@40;ButlerEnemy@70;ForestGiant@250;Nutcracker@150;FlowerSnakeEnemy@10;Maneater@40;CaveDwellerEnemy@40;SpringMan@0;DoublewingedBird@5;PufferEnemy@0;BushWolf@50;Blob@0;Peeper@5", "EN - Optional override for all monster EXP using format: MonsterName@XP;MonsterName2@XP2...\nFR - Remplacement facultatif de tous les EXP monstres au format: Monstre@XP;Monstre2@XP2...").Value; EnemyBlinkingLight.LoadEnemyLightConfigsFromString("Centiped:255,0,0:25:5:0.3f;MouthDog:255,0,0:100:10:0.3f;Flowerman:255,0,0:25:5:0.3f;SandSpider:255,255,0:25:2:0.3f;Crawler:255,0,0:10:3:0.6f;ForestGiant:255,0,0:100:15:0.5f;CaveDwellerEnemy:255,0,0:25:5:0.5f;Peeper:255,0,255:10:1:0.3f;"); EnemyAIPatch.LoadEnemyRewardsFromString(value); ReservedSlots = false; MikesTweaks = false; Log.LogInfo((object)"Début de la détection des mods de slots..."); Log.LogInfo((object)"ReservedItemSlotCore non détecté par GUID. Vérification d'autres mods..."); foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos) { string gUID = pluginInfo.Value.Metadata.GUID; if (gUID.ToLowerInvariant().Contains("reserveditem")) { Log.LogInfo((object)("Détection d'un mod contenant 'ReservedItem': " + gUID + ". HandSlots sera désactivé.")); ReservedSlots = true; } if (!gUID.ToLowerInvariant().Contains("mikestweaks")) { continue; } Log.LogInfo((object)"MikesTweaks détecté."); MikesTweaks = true; try { ConfigEntryBase[] configEntries = pluginInfo.Value.Instance.Config.GetConfigEntries(); ConfigEntryBase[] array = configEntries; foreach (ConfigEntryBase val2 in array) { if (val2.Definition.Key == "ExtraItemSlots" && int.Parse(val2.GetSerializedValue()) > 0) { Log.LogInfo((object)"MikesTweaks ajoute des slots. HandSlots sera désactivé."); ReservedSlots = true; } } } catch (Exception ex) { Log.LogError((object)("Erreur lors de la lecture de la config de MikesTweaks: " + ex.Message)); } } if (ReservedSlots) { Log.LogWarning((object)"Résultat détection: Le flag 'ReservedSlots' est TRUE (par un autre mod que le Core API). La compétence HandSlots sera désactivée."); } else { Log.LogInfo((object)"Résultat détection: Aucun mod de slot conflictuel détecté. La compétence HandSlots devrait être active."); } SkillConfig.InitConfig(); } public void BindConfig<T>(string section, string key, T defaultValue, string description = "") { ((BaseUnityPlugin)this).Config.Bind<T>(section, key, defaultValue, description); } public IDictionary<string, string> GetAllConfigEntries() { return ((BaseUnityPlugin)this).Config.GetConfigEntries().ToDictionary((ConfigEntryBase entry) => entry.Definition.Key, (ConfigEntryBase entry) => entry.GetSerializedValue()); } } internal class LC_XP : NetworkBehaviour { public LethalNetworkVariable<int> teamLevel = new LethalNetworkVariable<int>("teamLevel") { Value = 0 }; public LethalNetworkVariable<int> teamXP = new LethalNetworkVariable<int>("teamXP") { Value = 0 }; public LethalNetworkVariable<int> teamTotalValue = new LethalNetworkVariable<int>("teamTotalValue") { Value = 0 }; public LethalNetworkVariable<int> teamXPRequired = new LethalNetworkVariable<int>("teamXPRequired") { Value = 0 }; public LethalNetworkVariable<int> teamLootLevel = new LethalNetworkVariable<int>("teamLootLevel") { Value = 0 }; public LethalClientEvent playerConnectClientEvent = new LethalClientEvent("playerConnectEvent", (Action)null, (Action<ulong>)null); public LethalServerEvent playerConnectServerEvent = new LethalServerEvent("playerConnectEvent", (Action<ulong>)null); public LethalClientEvent evaluateXPRequirementClientEvent = new LethalClientEvent("evaluateXPRequirementEvent", (Action)null, (Action<ulong>)null); public LethalServerEvent evaluateXPRequirementServerEvent = new LethalServerEvent("evaluateXPRequirementEvent", (Action<ulong>)null); public LethalClientEvent calculateAllPlayersHandSlotsClientEvent = new LethalClientEvent("calculateAllPlayersHandSlotsEvent", (Action)null, (Action<ulong>)null); public LethalServerEvent calculateAllPlayersHandSlotsServerEvent = new LethalServerEvent("calculateAllPlayersHandSlotsEvent", (Action<ulong>)null); public LethalServerMessage<string> sendConfigServerMessage = new LethalServerMessage<string>("sendConfigMessage", (Action<string, ulong>)null); public LethalClientMessage<string> sendConfigClientMessage = new LethalClientMessage<string>("sendConfigMessage", (Action<string>)null, (Action<string, ulong>)null); public LethalServerMessage<ulong> requestProfileDataServerMessage = new LethalServerMessage<ulong>("requestProfileDataMessage", (Action<ulong, ulong>)null); public LethalClientMessage<ulong> requestProfileDataClientMessage = new LethalClientMessage<ulong>("requestProfileDataMessage", (Action<ulong>)null, (Action<ulong, ulong>)null); public LethalServerMessage<string> sendProfileDataServerMessage = new LethalServerMessage<string>("sendProfileDataMessage", (Action<string, ulong>)null); public LethalClientMessage<string> receiveProfileDataClientMessage = new LethalClientMessage<string>("sendProfileDataMessage", (Action<string>)null, (Action<string, ulong>)null); public LethalServerMessage<string> saveProfileDataServerMessage = new LethalServerMessage<string>("saveProfileDataMessage", (Action<string, ulong>)null); public LethalClientMessage<string> saveProfileDataClientMessage = new LethalClientMessage<string>("saveProfileDataMessage", (Action<string>)null, (Action<string, ulong>)null); public LethalServerMessage<int> updateTeamLootLevelServerMessage = new LethalServerMessage<int>("updateTeamLootLevelMessage", (Action<int, ulong>)null); public LethalClientMessage<int> updateTeamLootLevelClientMessage = new LethalClientMessage<int>("updateTeamLootLevelMessage", (Action<int>)null, (Action<int, ulong>)null); public LethalServerMessage<int> updateTeamXPServerMessage = new LethalServerMessage<int>("updateTeamXPMessage", (Action<int, ulong>)null); public LethalClientMessage<int> updateTeamXPClientMessage = new LethalClientMessage<int>("updateTeamXPMessage", (Action<int>)null, (Action<int, ulong>)null); public LethalServerMessage<int> updatePlayerSkillpointsServerMessage = new LethalServerMessage<int>("updatePlayerSkillPointsMessage", (Action<int, ulong>)null); public LethalClientMessage<int> updatePlayerSkillpointsClientMessage = new LethalClientMessage<int>("updatePlayerSkillPointsMessage", (Action<int>)null, (Action<int, ulong>)null); public LethalServerMessage<int> updateSPHandSlotsServerMessage = new LethalServerMessage<int>("updateSPHandSlotsMessage", (Action<int, ulong>)null); public LethalClientMessage<int> updateSPHandSlotsClientMessage = new LethalClientMessage<int>("updateSPHandSlotsMessage", (Action<int>)null, (Action<int, ulong>)null); public LethalServerMessage<PlayerHandSlotData> updatePlayerHandSlotsServerMessage = new LethalServerMessage<PlayerHandSlotData>("updatePlayerHandSlotsMessage", (Action<PlayerHandSlotData, ulong>)null); public LethalClientMessage<PlayerHandSlotData> updatePlayerHandSlotsClientMessage = new LethalClientMessage<PlayerHandSlotData>("updatePlayerHandSlotsMessage", (Action<PlayerHandSlotData>)null, (Action<PlayerHandSlotData, ulong>)null); public LethalServerMessage<PlayerJumpHeightData> updatePlayerJumpForceServerMessage = new LethalServerMessage<PlayerJumpHeightData>("updatePlayerJumpForceMessage", (Action<PlayerJumpHeightData, ulong>)null); public LethalClientMessage<PlayerJumpHeightData> updatePlayerJumpForceClientMessage = new LethalClientMessage<PlayerJumpHeightData>("updatePlayerJumpForceMessage", (Action<PlayerJumpHeightData>)null, (Action<PlayerJumpHeightData, ulong>)null); public int skillPoints; public SkillList skillList; public SkillsGUI guiObj; public bool Initialized = false; public bool loadedSave = false; public void Start() { LethalPlugin.Log.LogInfo((object)"XP Network Behavior Made!"); teamLevel.OnValueChanged += OnTeamLevelChange; teamXP.OnValueChanged += OnTeamXPChange; playerConnectServerEvent.OnReceived += PlayerConnect_C2SEvent; evaluateXPRequirementServerEvent.OnReceived += EvaluateXPRequirements_C2SEvent; calculateAllPlayersHandSlotsServerEvent.OnReceived += RefreshAllPlayerHandSlots_C2SEvent; requestProfileDataServerMessage.OnReceived += RequestSavedData_C2SMessage; saveProfileDataServerMessage.OnReceived += SaveProfileData_C2SMessage; updateTeamLootLevelServerMessage.OnReceived += UpdateTeamLootLevel_C2SMessage; updateTeamXPServerMessage.OnReceived += UpdateTeamXP_C2SMessage; updateSPHandSlotsServerMessage.OnReceived += UpdateSPHandSlots_C2SMessage; updatePlayerJumpForceServerMessage.OnReceived += UpdatePlayerJumpHeight_C2SMessage; sendConfigClientMessage.OnReceived += SendHostConfig_S2CMessage; receiveProfileDataClientMessage.OnReceived += LoadProfileData_S2CMessage; updatePlayerSkillpointsClientMessage.OnReceived += UpdateSkillPoints_S2CMessage; updatePlayerHandSlotsClientMessage.OnReceived += UpdatePlayerHandSlots_S2CMessage; updatePlayerJumpForceClientMessage.OnReceived += UpdatePlayerJumpHeight_S2CMessage; playerConnectClientEvent.InvokeServer(); } public override void OnDestroy() { teamLevel.OnValueChanged -= OnTeamLevelChange; teamXP.OnValueChanged -= OnTeamXPChange; teamLootLevel.OnValueChanged -= guiObj.TeamLootHudUpdate; playerConnectServerEvent.OnReceived -= PlayerConnect_C2SEvent; evaluateXPRequirementServerEvent.OnReceived -= EvaluateXPRequirements_C2SEvent; calculateAllPlayersHandSlotsServerEvent.OnReceived -= RefreshAllPlayerHandSlots_C2SEvent; requestProfileDataServerMessage.OnReceived -= RequestSavedData_C2SMessage; saveProfileDataServerMessage.OnReceived -= SaveProfileData_C2SMessage; updateTeamLootLevelServerMessage.OnReceived -= UpdateTeamLootLevel_C2SMessage; updateTeamXPServerMessage.OnReceived -= UpdateTeamXP_C2SMessage; updateSPHandSlotsServerMessage.OnReceived -= UpdateSPHandSlots_C2SMessage; sendConfigClientMessage.OnReceived -= SendHostConfig_S2CMessage; receiveProfileDataClientMessage.OnReceived -= LoadProfileData_S2CMessage; updatePlayerSkillpointsClientMessage.OnReceived -= UpdateSkillPoints_S2CMessage; updatePlayerHandSlotsClientMessage.OnReceived -= UpdatePlayerHandSlots_S2CMessage; ((NetworkBehaviour)this).OnDestroy(); } private void OnTeamLevelChange(int newLevel) { ((MonoBehaviour)this).StartCoroutine(WaitUntilInitialisedThenAction(HUDManagerPatch.ShowLevelUp)); } private void OnTeamXPChange(int newXP) { ((MonoBehaviour)this).StartCoroutine(WaitUntilInitialisedThenAction(HUDManagerPatch.ShowXPUpdate)); } public IEnumerator WaitUntilInitialisedThenAction(Action callback) { yield return (object)new WaitUntil((Func<bool>)(() => Initialized)); callback(); } public void PlayerConnect_C2SEvent(ulong clientId) { LethalPlugin.Log.LogInfo((object)$"Connexion reçue par : {clientId}"); IDictionary<string, string> allConfigEntries = LethalPlugin.Instance.GetAllConfigEntries(); string text = JsonConvert.SerializeObject((object)allConfigEntries); LethalPlugin.Log.LogInfo((object)("Sauvegarde des configs -> " + text)); sendConfigServerMessage.SendAllClients(text, true); } public void LoadSharedData() { SaveSharedData saveSharedData = SaveManager.LoadSharedFile(); if (saveSharedData == null) { LethalPlugin.Log.LogInfo((object)"données partagé innexistante"); return; } LethalPlugin.Log.LogInfo((object)"Chargement du lobby, partage des données en cour"); teamXP.Value = saveSharedData.xp; teamLevel.Value = saveSharedData.level; teamTotalValue.Value = saveSharedData.quota; teamXPRequired.Value = CalculateXPRequirement(); LethalPlugin.Log.LogInfo((object)$"{saveSharedData.level} niveau actuel, {saveSharedData.xp} EXP, {saveSharedData.quota} Profit, {teamXPRequired.Value} teamXPRequired"); } public IEnumerator LoadProfileData(string data) { LethalPlugin.Log.LogInfo((object)("Reception des données du joueur depuis le joueur host -> " + data)); yield return (object)new WaitUntil((Func<bool>)(() => Initialized)); if (loadedSave) { LethalPlugin.Log.LogWarning((object)"Données des joueurs charger par le Host."); yield return null; } loadedSave = true; SaveData saveData = JsonConvert.DeserializeObject<SaveData>(data); skillPoints = saveData.skillPoints; LethalPlugin.Log.LogDebug((object)$"skillPoints -> {skillPoints}"); int skillCheck = 0; foreach (KeyValuePair<UpgradeType, int> skill in saveData.skillAllocation) { LethalPlugin.Log.LogDebug((object)$"{skill.Key} -> {skill.Value}"); skillList.skills[skill.Key].SetLevel(skill.Value, triggerHostProfileSave: false); skillCheck += skill.Value; LethalPlugin.Log.LogDebug((object)$"Skill list -> {skillCheck}"); } if (skillCheck + skillPoints < teamLevel.Value + 5) { LethalPlugin.Log.LogInfo((object)$"Skill check pour le niveau actuel, Ajout {teamLevel.Value + 5 - (skillCheck + skillPoints)} points."); skillPoints += teamLevel.Value + 5 - (skillCheck + skillPoints); } LP_NetworkManager.xpInstance.guiObj.UpdateAllStats(); } public int CalculateXPRequirement() { int connectedPlayersAmount = StartOfRound.Instance.connectedPlayersAmount; int timesFulfilledQuota = TimeOfDay.Instance.timesFulfilledQuota; int num = int.Parse(SkillConfig.hostConfig["Minimum EXP"]); int num2 = int.Parse(SkillConfig.hostConfig["Maximum EXP"]); int num3 = int.Parse(SkillConfig.hostConfig["EXP per player / EXP par Joueur"]); int num4 = connectedPlayersAmount * num3; int num5 = num + num4; int num6 = int.Parse(SkillConfig.hostConfig["Quota Multiplier"]); int num7 = timesFulfilledQuota * num6; num5 += (int)((float)num5 * ((float)num7 / 100f)); if (num5 > num2) { num5 = num2; } LethalPlugin.Log.LogInfo((object)$"{connectedPlayersAmount} joueurs, {timesFulfilledQuota} quotas, {num} cout initial, {num4} valeur par personne additionnel, {num7} valeur du quota additionnel, {num5} cout total."); return num5; } public int GetXP() { return teamXP.Value; } public int GetLevel() { return teamLevel.Value; } public int GetProfit() { return teamTotalValue.Value; } public int GetSkillPoints() { return skillPoints; } public void SetSkillPoints(int num) { skillPoints = num; } public void EvaluateXPRequirements_C2SEvent(ulong clientId) { ((MonoBehaviour)this).StartCoroutine(XPRequirementCoroutine()); } public IEnumerator XPRequirementCoroutine() { yield return (object)new WaitForSeconds(0.5f); teamXPRequired.Value = CalculateXPRequirement(); } public void UpdateTeamXP_C2SMessage(int xpToAdd, ulong clientId) { LethalNetworkVariable<int> obj = teamXP; obj.Value += xpToAdd; LethalNetworkVariable<int> obj2 = teamTotalValue; obj2.Value += xpToAdd; int num = GetXP(); if (num >= teamXPRequired.Value) { int num2 = 0; while (num >= teamXPRequired.Value) { num2++; num -= teamXPRequired.Value; } teamXP.Value = num; LethalNetworkVariable<int> obj3 = teamLevel; obj3.Value += num2; updatePlayerSkillpointsServerMessage.SendAllClients(num2, true); } } public void UpdateSkillPoints_S2CMessage(int pointsToAdd) { skillPoints += pointsToAdd; } public void UpdateTeamLootLevel_C2SMessage(int change, ulong clientId) { int value = teamLootLevel.Value; if (value + change < 0) { teamLootLevel.Value = 0; } else { LethalNetworkVariable<int> obj = teamLootLevel; obj.Value += change; } LethalPlugin.Log.LogInfo((object)$"la valeur du taux de loot à changer -> {change} pour un total de {teamLootLevel.Value}."); } public void UpdateSPHandSlots_C2SMessage(int slotChange, ulong clientId) { if (!LethalPlugin.ReservedSlots) { LethalPlugin.Log.LogInfo((object)$"Client > Host(ServerRPC) : Mise à jour du Joueur {clientId} -> {slotChange} slots !"); PlayerHandSlotData playerHandSlotData = new PlayerHandSlotData(clientId, slotChange); LethalPlugin.Log.LogDebug((object)$"Envoie des données à tous les joueurs par le joueur {playerHandSlotData.clientId} -> {playerHandSlotData.additionalSlots} slots !"); updatePlayerHandSlotsServerMessage.SendAllClients(playerHandSlotData, true); } } public void UpdatePlayerHandSlots_S2CMessage(PlayerHandSlotData data) { LethalPlugin.Log.LogInfo((object)$"Host(ServerRPC) > Client : Mise à jour reçu par le joueur {data.clientId} -> {data.additionalSlots} slots !"); if (data.additionalSlots == 0) { LethalPlugin.Log.LogWarning((object)"Valeur = 0, possible perte d'information, si les valeurs sont différente entre le Client > Host(ServerRPC) et le Host(ServerRPC) > Client. Sinon ignorez ce message."); } SetHandSlot(data.clientId, data.additionalSlots); } public void SetHandSlot(ulong playerID, int additionalSlots) { //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.playerClientId != playerID) { continue; } int num = 4 + additionalSlots; List<GrabbableObject> list = val.ItemSlots.ToList(); if (val.currentItemSlot > num - 1) { HandSlots.SwitchItemSlots(val, num - 1); } for (int j = 0; j < list.Count; j++) { if (j > num - 1 && (Object)(object)list[j] != (Object)null) { HandSlots.SwitchItemSlots(val, j); val.DiscardHeldObject(false, (NetworkObject)null, default(Vector3), true); LethalPlugin.Log.LogWarning((object)"Le joueur porter un objet et viens de le lâcher !"); } } val.ItemSlots = (GrabbableObject[])(object)new GrabbableObject[num]; for (int k = 0; k < list.Count; k++) { if (!((Object)(object)list[k] == (Object)null)) { val.ItemSlots[k] = list[k]; } } LethalPlugin.Log.LogDebug((object)$"Le joueur {playerID} dispose de {val.ItemSlots.Length} slots après le partage des configs"); if ((Object)(object)val == (Object)(object)GameNetworkManager.Instance.localPlayerController) { LethalPlugin.Log.LogDebug((object)"Mise à jour de l'interface du joueur."); int num2 = (int)skillList.skills[UpgradeType.HandSlot].GetTrueValue(); int num3 = (int)Math.Floor((double)(num2 / 100)); int targetSlotCount = 4 + num3; HandSlots.UpdateHudSlots(targetSlotCount); } break; } } public void RefreshAllPlayerHandSlots_C2SEvent(ulong clientId) { if (LethalPlugin.ReservedSlots || !LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.HandSlot)) { return; } PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (((Component)val).gameObject.activeSelf) { ulong playerClientId = val.playerClientId; int additionalSlots = val.ItemSlots.Length - 4; LethalPlugin.Log.LogInfo((object)"Valeurs rafraichis des slots pour l'ensemble des joueurs."); updatePlayerHandSlotsServerMessage.SendAllClients(new PlayerHandSlotData(playerClientId, additionalSlots), true); } } } public void SendHostConfig_S2CMessage(string serializedConfig) { IDictionary<string, string> dictionary = JsonConvert.DeserializeObject<IDictionary<string, string>>(serializedConfig); foreach (KeyValuePair<string, string> item in dictionary) { SkillConfig.hostConfig[item.Key] = item.Value; LethalPlugin.Log.LogInfo((object)("Chargement des configs : " + item.Key + " = " + item.Value)); } if (!Initialized) { Initialized = true; LP_NetworkManager.xpInstance = this; JumpHeight.savelevel = 0; LethalPlugin.Log.LogInfo((object)"Reset savelevel for Double jump"); skillList = new SkillList(); skillList.InitializeSkills(); if (GameNetworkManager.Instance.isHostingGame) { LoadSharedData(); } guiObj = new SkillsGUI(); teamLootLevel.OnValueChanged += guiObj.TeamLootHudUpdate; skillPoints = teamLevel.Value + int.Parse(SkillConfig.hostConfig["Initial Statistics Point(s) / Point(s) de Statistiques Initial"]); calculateAllPlayersHandSlotsClientEvent.InvokeServer(); evaluateXPRequirementClientEvent.InvokeServer(); } } public void RequestSavedData_C2SMessage(ulong steamID, ulong clientId) { string text = SaveManager.LoadPlayerFile(steamID); PlayerControllerB playerController = LethalNetworkExtensions.GetPlayerController(clientId); sendProfileDataServerMessage.SendClient(text, playerController.actualClientId); } public void LoadProfileData_S2CMessage(string saveData) { LethalPlugin.Log.LogInfo((object)("Reception des configs : Host(ServerRPC) > Client -> " + saveData)); if (saveData != null) { ((MonoBehaviour)this).StartCoroutine(LoadProfileData(saveData)); } } public void SaveProfileData_C2SMessage(string data, ulong clientId) { SaveProfileData saveProfileData = JsonConvert.DeserializeObject<SaveProfileData>(data); LethalPlugin.Log.LogInfo((object)$"Reception de la requête des données sauvegardé pour {saveProfileData.steamId}, données -> {JsonConvert.SerializeObject((object)saveProfileData.saveData)}"); SaveManager.Save(saveProfileData.steamId, saveProfileData.saveData); SaveManager.SaveShared(teamXP.Value, teamLevel.Value, teamTotalValue.Value); } public void UpdatePlayerJumpHeight_C2SMessage(PlayerJumpHeightData playerData, ulong clientId) { LethalPlugin.Log.LogInfo((object)$"requête reçue par {clientId} [{playerData.clientId}] modification de la hauteur du saut {playerData.jumpSkillValue}"); updatePlayerJumpForceServerMessage.SendAllClients(playerData, true); } public void UpdatePlayerJumpHeight_S2CMessage(PlayerJumpHeightData playerData) { PlayerControllerB playerController = LethalNetworkExtensions.GetPlayerController(playerData.clientId); Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.JumpHeight]; float num = (float)playerData.jumpSkillValue * skill.GetMultiplier() / 100f * 13f; playerController.jumpForce = 13f + num; LethalPlugin.Log.LogInfo((object)$"Mise à jour client {playerData.clientId} hauteur de saut. ajout {num} - {playerController.jumpForce}"); } public int GetWisdomLevel(int playerId) { if (skillList != null && skillList.skills.ContainsKey(UpgradeType.Wisdom)) { return skillList.skills[UpgradeType.Wisdom].GetLevel(); } return 0; } } public static class PluginInfo { public const string PLUGIN_GUID = "LethalProgression"; public const string PLUGIN_NAME = "LethalProgression"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace LethalProgression.Utils { public static class DetectionUtils { private static int enemyLayerMask = 524288; private static float lastDetectionTime = -1f; private static float detectionCooldown = 1f; private static Dictionary<EnemyAI, GameObject> activeLights = new Dictionary<EnemyAI, GameObject>(); public static List<EnemyAI> ScanAndLogNearbyEnemies(Vector3 center) { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_02c4: Unknown result type (might be due to invalid IL or missing references) //IL_02cb: Expected O, but got Unknown //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) List<EnemyAI> list = new List<EnemyAI>(); if (Time.time < lastDetectionTime + detectionCooldown) { return activeLights.Keys.Where((EnemyAI e) => (Object)(object)e != (Object)null && (Object)(object)((Component)e).gameObject != (Object)null).ToList(); } lastDetectionTime = Time.time; Collider[] array = Physics.OverlapSphere(center, (float)Perception.PerceptionRange, enemyLayerMask); HashSet<EnemyAI> currentDetectedSet = new HashSet<EnemyAI>(); Collider[] array2 = array; foreach (Collider val in array2) { EnemyAI componentInParent = ((Component)val).GetComponentInParent<EnemyAI>(); if ((Object)(object)componentInParent != (Object)null && !componentInParent.isEnemyDead && componentInParent.enemyType.canDie && currentDetectedSet.Add(componentInParent)) { list.Add(componentInParent); } } List<EnemyAI> list2 = activeLights.Keys.Where((EnemyAI enemy) => !currentDetectedSet.Contains(enemy) || (Object)(object)enemy == (Object)null || (Object)(object)((Component)enemy).gameObject == (Object)null || enemy.isEnemyDead).ToList(); foreach (EnemyAI item in list2) { if (activeLights.TryGetValue(item, out var value)) { if ((Object)(object)value != (Object)null) { Object.Destroy((Object)(object)value); } activeLights.Remove(item); } else { if (!((Object)(object)item == (Object)null)) { continue; } List<EnemyAI> list3 = (from pair in activeLights where (Object)(object)pair.Key == (Object)null select pair.Key).ToList(); foreach (EnemyAI item2 in list3) { activeLights.Remove(item2); } } } foreach (EnemyAI item3 in list) { if (activeLights.ContainsKey(item3)) { continue; } Transform val2 = ((Component)item3).transform; SkinnedMeshRenderer componentInChildren = ((Component)item3).GetComponentInChildren<SkinnedMeshRenderer>(); if ((Object)(object)componentInChildren != (Object)null) { val2 = componentInChildren.rootBone ?? ((Component)componentInChildren).transform; } else { MeshRenderer componentInChildren2 = ((Component)item3).GetComponentInChildren<MeshRenderer>(); if ((Object)(object)componentInChildren2 != (Object)null) { val2 = ((Component)componentInChildren2).transform; } } GameObject val3 = new GameObject("LethalProgression_BlinkingLight"); val3.transform.SetParent(val2, false); val3.transform.localPosition = Vector3.up * 0.5f; val3.AddComponent<EnemyBlinkingLight>(); activeLights.Add(item3, val3); } if (list.Count > 0) { string arg = string.Join(", ", list.Select((EnemyAI e) => e.enemyType.enemyName)); LethalPlugin.Log.LogInfo((object)$"Nearby enemies detected ({list.Count}) within {Perception.PerceptionRange}m: {arg}"); } return list; } public static void ClearAllEnemyLights() { foreach (KeyValuePair<EnemyAI, GameObject> activeLight in activeLights) { if ((Object)(object)activeLight.Value != (Object)null) { Object.Destroy((Object)(object)activeLight.Value); } } activeLights.Clear(); LethalPlugin.Log.LogInfo((object)"Cleared all enemy detection lights."); } } [Serializable] public class EnemyLightConfig { public string enemyType; public Color lightColor = Color.red; public float intensity = 100f; public float range = 5f; public float blinkFrequency = 0.3f; } public class EnemyBlinkingLight : MonoBehaviour { private Light attachedLight; private float timer = 0f; private float baseIntensity = 100f; public float defaultBlinkFrequency = 0.3f; public float defaultIntensity = 0f; public float defaultRange = 0f; public Color defaultLightColor = Color.red; private static Dictionary<string, EnemyLightConfig> _enemyLightConfigs = new Dictionary<string, EnemyLightConfig>(); public static void LoadEnemyLightConfigsFromString(string configString) { //IL_0132: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) _enemyLightConfigs.Clear(); if (string.IsNullOrWhiteSpace(configString)) { Debug.LogWarning((object)"[LethalProgression] EnemyLight config string is empty!"); return; } Debug.Log((object)"[LethalProgression] Reading EnemyLight configs..."); string[] array = configString.Split(';'); string[] array2 = array; foreach (string text in array2) { if (string.IsNullOrWhiteSpace(text)) { continue; } string[] array3 = text.Split(':'); if (array3.Length < 2) { continue; } string text2 = array3[0].Trim().ToLower(); EnemyLightConfig enemyLightConfig = new EnemyLightConfig(); enemyLightConfig.enemyType = text2; try { if (array3.Length > 1 && !string.IsNullOrWhiteSpace(array3[1])) { string[] array4 = array3[1].Split(','); if (array4.Length >= 3) { float num = float.Parse(array4[0]) / 255f; float num2 = float.Parse(array4[1]) / 255f; float num3 = float.Parse(array4[2]) / 255f; float num4 = ((array4.Length > 3) ? float.Parse(array4[3]) : 1f); enemyLightConfig.lightColor = new Color(num, num2, num3, num4); } } if (array3.Length > 2 && !string.IsNullOrWhiteSpace(array3[2])) { enemyLightConfig.intensity = float.Parse(array3[2]); } if (array3.Length > 3 && !string.IsNullOrWhiteSpace(array3[3])) { enemyLightConfig.range = float.Parse(array3[3]); } if (array3.Length > 4 && !string.IsNullOrWhiteSpace(array3[4])) { enemyLightConfig.blinkFrequency = float.Parse(array3[4]); } _enemyLightConfigs[text2] = enemyLightConfig; Debug.Log((object)$"[LethalProgression] Registered light config for {text2} => Color:{enemyLightConfig.lightColor}, Intensity:{enemyLightConfig.intensity}, Range:{enemyLightConfig.range}, Frequency:{enemyLightConfig.blinkFrequency}"); } catch (Exception ex) { Debug.LogWarning((object)("[LethalProgression] Error parsing light config for " + text2 + ": " + ex.Message)); } } } private void Awake() { attachedLight = ((Component)this).gameObject.AddComponent<Light>(); EnemyAI componentInParent = ((Component)this).GetComponentInParent<EnemyAI>(); if ((Object)(object)componentInParent != (Object)null) { ConfigureLightForEnemy(componentInParent); } else { ConfigureDefaultLight(); } ((Behaviour)attachedLight).enabled = true; } private void ConfigureLightForEnemy(EnemyAI enemy) { //IL_0079: Unknown result type (might be due to invalid IL or missing references) string text = ((object)enemy.enemyType).ToString(); string text2 = text.Replace("(Clone)", "").Replace("(EnemyType)", "").Trim() .ToLower(); bool flag = false; foreach (KeyValuePair<string, EnemyLightConfig> enemyLightConfig in _enemyLightConfigs) { if (text2.Contains(enemyLightConfig.Key)) { EnemyLightConfig value = enemyLightConfig.Value; attachedLight.color = value.lightColor; baseIntensity = value.intensity; attachedLight.intensity = baseIntensity; attachedLight.range = value.range; defaultBlinkFrequency = value.blinkFrequency; flag = true; Debug.Log((object)("[LethalProgression] Applied custom light settings for enemy '" + text2 + "'")); break; } } if (!flag) { ConfigureDefaultLight(); Debug.Log((object)("[LethalProgression] No custom light settings found for enemy '" + text2 + "', using defaults")); } } private void ConfigureDefaultLight() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) attachedLight.color = defaultLightColor; baseIntensity = defaultIntensity; attachedLight.intensity = baseIntensity; attachedLight.range = defaultRange; } private void Update() { if ((Object)(object)attachedLight == (Object)null) { Object.Destroy((Object)(object)this); return; } timer += Time.deltaTime; float intensity = baseIntensity * (0.2f + 0.8f * ((Mathf.Sin(timer * defaultBlinkFrequency * MathF.PI) + 1f) / 2f)); attachedLight.intensity = intensity; } } [HarmonyPatch] public class EnemyPerceptionManager : MonoBehaviour { private static Dictionary<EnemyAI, float> detectedEnemies = new Dictionary<EnemyAI, float>(); private static float GetDetectionRange() { if (!Object.op_Implicit((Object)(object)LP_NetworkManager.xpInstance) || !LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Perception)) { return 0f; } float result = 50f; float result3; if (SkillConfig.hostConfig.ContainsKey("Perception Range / Portée de perception")) { if (float.TryParse(SkillConfig.hostConfig["Perception Range / Portée de perception"], out var result2)) { result = result2; } } else if (SkillConfig.hostConfig.ContainsKey("Perception : range / Perception : portée") && float.TryParse(SkillConfig.hostConfig["Perception : range / Perception : portée"], out result3)) { result = result3; } return result; } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "Update")] private static void DetectEnemies(PlayerControllerB __instance) { //IL_0101: 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) if (!Object.op_Implicit((Object)(object)LP_NetworkManager.xpInstance) || !LP_NetworkManager.xpInstance.skillList.IsSkillListValid() || !LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Perception)) { return; } if (__instance.isPlayerDead) { detectedEnemies.Clear(); PerceptionBar.ClearDetectedEnemies(); return; } if (LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Perception].GetLevel() < 1) { detectedEnemies.Clear(); PerceptionBar.ClearDetectedEnemies(); return; } float detectionRange = GetDetectionRange(); EnemyAI[] array = Object.FindObjectsOfType<EnemyAI>(); Dictionary<EnemyAI, float> dictionary = new Dictionary<EnemyAI, float>(); List<string> list = new List<string>(); EnemyAI[] array2 = array; foreach (EnemyAI val in array2) { if ((Object)(object)val == (Object)null || val.isEnemyDead) { continue; } float num = Vector3.Distance(((Component)__instance).transform.position, ((Component)val).transform.position); if (num <= detectionRange) { dictionary[val] = num; string text = ExtractEnemyType(val); if (!string.IsNullOrEmpty(text) && !list.Contains(text)) { list.Add(text); } } } detectedEnemies = dictionary; PerceptionBar.ClearDetectedEnemies(); foreach (string item in list) { PerceptionBar.AddDetectedEnemy(item); } PerceptionBar.UpdatePerceptionUI(); } private static string ExtractEnemyType(EnemyAI enemy) { string text = ((object)enemy.enemyType).ToString(); return text.Replace("(Clone)", "").Replace("(EnemyType)", "").Trim() .ToLower(); } } } namespace LethalProgression.GUI { public class SkillButtonState : MonoBehaviour { public Color originalColor = Color.white; } [HarmonyPatch] internal class GUIUpdate { public static bool isMenuOpen; public static SkillsGUI guiInstance; [HarmonyPostfix] [HarmonyPatch(typeof(QuickMenuManager), "Update")] private static void SkillMenuUpdate(QuickMenuManager __instance) { //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_016e: 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_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Unknown result type (might be due to invalid IL or missing references) if (guiInstance == null || !Object.op_Implicit((Object)(object)guiInstance.mainPanel)) { return; } if (!isMenuOpen) { guiInstance.mainPanel.SetActive(false); } else { if (!isMenuOpen) { return; } if (bool.Parse(SkillConfig.hostConfig["Respe Only in the ship / Respé Uniquement dans le vaisseau"]) && !bool.Parse(SkillConfig.hostConfig["Respe disabled / Respé désactivé"])) { if (GameNetworkManager.Instance.localPlayerController.isInHangarShipRoom) { guiInstance.SetUnspec(show: true); } else { guiInstance.SetUnspec(show: false); } } if (bool.Parse(SkillConfig.hostConfig["Respe Only in orbit / Respé Uniquement en orbit"])) { if (StartOfRound.Instance.inShipPhase) { guiInstance.SetUnspec(show: true); } else { guiInstance.SetUnspec(show: false); } } if (bool.Parse(SkillConfig.hostConfig["Respe disabled / Respé désactivé"])) { guiInstance.SetUnspec(show: false); } Vector2 val = ((InputControl<Vector2>)(object)((Pointer)Mouse.current).position).ReadValue(); GameObject gameObject = ((Component)guiInstance.mainPanel.transform.GetChild(2)).gameObject; float x = gameObject.transform.position.x; Rect rect = gameObject.GetComponent<RectTransform>().rect; float num = x - ((Rect)(ref rect)).width; float x2 = gameObject.transform.position.x; rect = gameObject.GetComponent<RectTransform>().rect; float num2 = x2 + ((Rect)(ref rect)).width; float y = gameObject.transform.position.y; rect = gameObject.GetComponent<RectTransform>().rect; float num3 = y - ((Rect)(ref rect)).height; float y2 = gameObject.transform.position.y; rect = gameObject.GetComponent<RectTransform>().rect; float num4 = y2 + ((Rect)(ref rect)).height; if (val.x >= num && val.x <= num2) { if (val.y >= num3 && val.y <= num4) { ((Component)guiInstance.mainPanel.transform.GetChild(2).GetChild(2)).gameObject.SetActive(true); } else { ((Component)guiInstance.mainPanel.transform.GetChild(2).GetChild(2)).gameObject.SetActive(false); } } else { ((Component)guiInstance.mainPanel.transform.GetChild(2).GetChild(2)).gameObject.SetActive(false); } guiInstance.mainPanel.SetActive(true); GameObject val2 = GameObject.Find("Systems/UI/Canvas/QuickMenu/MainButtons"); val2.SetActive(false); GameObject val3 = GameObject.Find("Systems/UI/Canvas/QuickMenu/PlayerList"); val3.SetActive(false); RealTimeUpdateInfo(); } } [HarmonyPostfix] [HarmonyPatch(typeof(QuickMenuManager), "CloseQuickMenu")] private static void SkillMenuClose(QuickMenuManager __instance) { isMenuOpen = false; } private static void RealTimeUpdateInfo() { GameObject gameObject = ((Component)guiInstance.mainPanel.transform.GetChild(2)).gameObject; gameObject = ((Component)gameObject.transform.GetChild(1)).gameObject; TextMeshProUGUI component = gameObject.GetComponent<TextMeshProUGUI>(); ((TMP_Text)component).text = LP_NetworkManager.xpInstance.GetSkillPoints().ToString(); } } internal class SkillsGUI { public GameObject mainPanel; public GameObject infoPanel; public GameObject templateSlot; public Skill activeSkill; public int shownSkills = 0; public List<GameObject> skillButtonsList = new List<GameObject>(); public List<GameObject> separatorsList = new List<GameObject>(); public static HashSet<UpgradeType> simplifiedTextSkills = new HashSet<UpgradeType> { UpgradeType.Doublejump, UpgradeType.Nightvision, UpgradeType.Perception }; public SkillsGUI() { CreateSkillMenu(); GUIUpdate.guiInstance = this; } public void OpenSkillMenu() { //IL_004b: Unknown result type (might be due to invalid IL or missing references) GUIUpdate.isMenuOpen = true; mainPanel.SetActive(true); if (Object.op_Implicit((Object)(object)GameObject.Find("SkillMenu/Scroll/SkillContents"))) { GameObject.Find("SkillMenu/Scroll/SkillContents").gameObject.transform.localScale = new Vector3(0.327f, 0.3f, 1f); } } public void CreateSkillMenu() { //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Expected O, but got Unknown //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown mainPanel = Object.Instantiate<GameObject>(LethalPlugin.skillBundle.LoadAsset<GameObject>("SkillMenu")); ((Object)mainPanel).name = "SkillMenu"; mainPanel.SetActive(false); templateSlot = Object.Instantiate<GameObject>(GameObject.Find("Systems/UI/Canvas/IngamePlayerHUD/Inventory/Slot3")); ((Object)templateSlot).name = "TemplateSlot"; templateSlot.SetActive(false); infoPanel = ((Component)mainPanel.transform.GetChild(1)).gameObject; infoPanel.SetActive(false); GameObject gameObject = ((Component)mainPanel.transform.GetChild(4)).gameObject; gameObject.GetComponent<Button>().onClick = new ButtonClickedEvent(); ((UnityEvent)gameObject.GetComponent<Button>().onClick).AddListener(new UnityAction(BackButton)); shownSkills = 0; if (LP_NetworkManager.xpInstance.skillList.skills == null) { return; } Dictionary<string, List<UpgradeType>> dictionary = new Dictionary<string, List<UpgradeType>>(); dictionary["Stats"] = new List<UpgradeType> { UpgradeType.Resist, UpgradeType.HPRegen, UpgradeType.Stamina, UpgradeType.SprintSpeed, UpgradeType.JumpHeight, UpgradeType.Strength, UpgradeType.Critical, UpgradeType.Oxygen, UpgradeType.Battery, UpgradeType.Vision, UpgradeType.Value, UpgradeType.Wisdom, UpgradeType.HandSlot }; dictionary["Capacity"] = new List<UpgradeType> { UpgradeType.Doublejump, UpgradeType.Nightvision, UpgradeType.Perception }; HashSet<UpgradeType> hashSet = new HashSet<UpgradeType>(); bool flag = true; foreach (KeyValuePair<string, List<UpgradeType>> item in dictionary) { if (!flag) { AddSkillSeparator(item.Key + "_separator"); } else { flag = false; } foreach (UpgradeType item2 in item.Value) { if (LP_NetworkManager.xpInstance.skillList.skills.ContainsKey(item2)) { Skill skill = LP_NetworkManager.xpInstance.skillList.skills[item2]; LethalPlugin.Log.LogInfo((object)("Creating button for " + skill.GetShortName())); GameObject val = SetupUpgradeButton(skill); LethalPlugin.Log.LogInfo((object)"Setup passed!"); skillButtonsList.Add(val); LethalPlugin.Log.LogInfo((object)"Added to skill list.."); LoadSkillData(skill, val); hashSet.Add(item2); } } } List<Skill> list = new List<Skill>(); foreach (KeyValuePair<UpgradeType, Skill> skill2 in LP_NetworkManager.xpInstance.skillList.skills) { if (!hashSet.Contains(skill2.Key)) { list.Add(skill2.Value); } } if (list.Count > 0) { AddSkillSeparator("Other_separator"); foreach (Skill item3 in list) { LethalPlugin.Log.LogInfo((object)("Creating button for remaining skill: " + item3.GetShortName())); GameObject val2 = SetupUpgradeButton(item3); skillButtonsList.Add(val2); LoadSkillData(item3, val2); } } TeamLootHudUpdate(0); } public void BackButton() { GUIUpdate.isMenuOpen = false; GameObject val = GameObject.Find("Systems/UI/Canvas/QuickMenu/MainButtons"); val.SetActive(true); GameObject val2 = GameObject.Find("Systems/UI/Canvas/QuickMenu/PlayerList"); val2.SetActive(true); } public void SetUnspec(bool show) { GameObject gameObject = ((Component)infoPanel.transform.GetChild(6)).gameObject; GameObject gameObject2 = ((Component)infoPanel.transform.GetChild(7)).gameObject; GameObject gameObject3 = ((Component)infoPanel.transform.GetChild(8)).gameObject; gameObject.SetActive(show); gameObject2.SetActive(show); gameObject3.SetActive(show); if (!bool.Parse(SkillConfig.hostConfig["Respe disabled / Respé désactivé"])) { GameObject gameObject4 = ((Component)infoPanel.transform.GetChild(9)).gameObject; gameObject4.SetActive(!show); } if (bool.Parse(SkillConfig.hostConfig["Respe Only in orbit / Respé Uniquement en orbit"])) { GameObject gameObject5 = ((Component)infoPanel.transform.GetChild(9)).gameObject; ((TMP_Text)((Component)gameObject5.transform).GetComponent<TextMeshProUGUI>()).SetText("Respé Disponible en Orbit", true); } } public GameObject AddSkillSeparator(string separatorName = "SEPARATOR") { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) LethalPlugin.Log.LogInfo((object)("Adding separator: " + separatorName)); GameObject val = new GameObject(separatorName); RectTransform val2 = val.AddComponent<RectTransform>(); Image val3 = val.AddComponent<Image>(); ((Graphic)val3).color = new Color(0.8f, 0f, 0f, 1f); GameObject gameObject = ((Component)mainPanel.transform.Find("Scroll")).gameObject; if ((Object)(object)gameObject == (Object)null) { LethalPlugin.Log.LogError((object)"Cannot find Scroll object"); Object.Destroy((Object)(object)val); return null; } GameObject gameObject2 = ((Component)gameObject.transform.Find("SkillContents")).gameObject; if ((Object)(object)gameObject2 == (Object)null) { LethalPlugin.Log.LogError((object)"Cannot find SkillContents object"); Object.Destroy((Object)(object)val); return null; } val.transform.SetParent(gameObject2.transform, false); val2.anchorMin = new Vector2(0f, 0f); val2.anchorMax = new Vector2(1f, 0f); val2.pivot = new Vector2(0.5f, 0.5f); val2.sizeDelta = new Vector2(0f, 25f); LayoutElement val4 = val.AddComponent<LayoutElement>(); val4.minHeight = 25f; val4.preferredHeight = 25f; val4.flexibleHeight = 0f; val4.minWidth = -1f; val4.preferredWidth = -1f; val.SetActive(true); LethalPlugin.Log.LogInfo((object)"Separator created and added to hierarchy"); shownSkills++; return val; } public GameObject SetupUpgradeButton(Skill skill) { //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Expected O, but got Unknown //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Expected O, but got Unknown GameObject gameObject = ((Component)mainPanel.transform.GetChild(0)).gameObject; GameObject val = Object.Instantiate<GameObject>(gameObject); if (!Object.op_Implicit((Object)(object)gameObject)) { LethalPlugin.Log.LogError((object)"Couldn't find template button!"); return null; } ((Object)val).name = skill.GetShortName(); GameObject gameObject2 = ((Component)mainPanel.transform.GetChild(3)).gameObject; GameObject gameObject3 = ((Component)gameObject2.transform.GetChild(1)).gameObject; val.transform.SetParent(gameObject3.transform, false); shownSkills++; GameObject gameObject4 = ((Component)val.transform.GetChild(0)).gameObject; ((TMP_Text)gameObject4.GetComponent<TextMeshProUGUI>()).SetText(skill.GetShortName(), true); GameObject gameObject5 = ((Component)val.transform.GetChild(1)).gameObject; ((TMP_Text)gameObject5.GetComponent<TextMeshProUGUI>()).SetText("", true); GameObject gameObject6 = ((Component)val.transform.GetChild(2)).gameObject; ((TMP_Text)gameObject6.GetComponent<TextMeshProUGUI>()).SetText("[" + skill.GetLevel() + " " + skill.GetAttribute() + "]", true); ((TMP_Text)val.GetComponentInChildren<TextMeshProUGUI>()).SetText(skill.GetShortName() ?? "", true); val.SetActive(true); val.GetComponent<Button>().onClick = new ButtonClickedEvent(); ((UnityEvent)val.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { UpdateStatInfo(skill); }); return val; } public void LoadSkillData(Skill skill, GameObject skillButton) { //IL_0155: 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_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) if (skill._teamShared) { return; } GameObject gameObject = ((Component)skillButton.transform.GetChild(1)).gameObject; ((TMP_Text)gameObject.GetComponent<TextMeshProUGUI>()).SetText("", true); GameObject gameObject2 = ((Component)skillButton.transform.GetChild(2)).gameObject; Image component = skillButton.GetComponent<Image>(); Outline component2 = skillButton.GetComponent<Outline>(); if (simplifiedTextSkills.Contains(skill.GetUpgradeType())) { bool flag = skill.GetMaxLevel() != 99999 && skill.GetLevel() >= skill.GetMaxLevel(); if (flag) { if ((Object)(object)component2 != (Object)null) { ((Shadow)component2).effectColor = new Color(0f, 1f, 0f, 1f); ((Shadow)component2).effectDistance = new Vector2(2f, 2f); } if ((Object)(object)component != (Object)null) { SkillButtonState skillButtonState = default(SkillButtonState); if (!skillButton.TryGetComponent<SkillButtonState>(ref skillButtonState)) { skillButtonState = skillButton.AddComponent<SkillButtonState>(); skillButtonState.originalColor = ((Graphic)component).color; } ((Graphic)component).color = new Color(0f, 0.7f, 0f, 1f); } } else { if ((Object)(object)component2 != (Object)null) { ((Shadow)component2).effectColor = Color.white; ((Shadow)component2).effectDistance = new Vector2(1f, 1f); } if ((Object)(object)component != (Object)null) { SkillButtonState skillButtonState2 = default(SkillButtonState); if (skillButton.TryGetComponent<SkillButtonState>(ref skillButtonState2)) { ((Graphic)component).color = skillButtonState2.originalColor; } else { ((Graphic)component).color = new Color(1f, 1f, 1f, 1f); } } } if (bool.Parse(SkillConfig.hostConfig["Language used : Frensh / Langue utilisé : Français"])) { if (skill.GetMaxLevel() == 99999) { if (skill.GetLevel() == 0) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "</color>] " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "</color>] " + skill.GetAttribute() + ".", true); } } else if (skill.GetLevel() == 0) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] " + skill.GetAttribute() + ".", true); } else if (flag) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#00ff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] " + skill.GetAttribute() + ".", true); } } else if (skill.GetMaxLevel() == 99999) { if (skill.GetLevel() == 0) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "</color>] " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "</color>] " + skill.GetAttribute() + ".", true); } } else if (skill.GetLevel() == 0) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] " + skill.GetAttribute() + ".", true); } else if (flag) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#00ff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] " + skill.GetAttribute() + ".", true); } } else if (bool.Parse(SkillConfig.hostConfig["Language used : Frensh / Langue utilisé : Français"])) { if (skill.GetMaxLevel() == 99999) { if (skill.GetLevel() == 0) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "</color>] Augmente de <color=#ff0000>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "</color>] Augmente de <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> " + skill.GetAttribute() + ".", true); } } else if (skill.GetLevel() == 0) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Augmente de <color=#ff0000>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "%) " + skill.GetAttribute() + ".", true); } else if (skill.GetLevel() >= skill.GetMaxLevel()) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#00ff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Augmente de <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "%) " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Augmente de <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "%) " + skill.GetAttribute() + ".", true); } } else if (skill.GetMaxLevel() == 99999) { if (skill.GetLevel() == 0) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "</color>] Increase by <color=#ff0000>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "</color>] Increase by <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> " + skill.GetAttribute() + ".", true); } } else if (skill.GetLevel() == 0) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Increase by <color=#ff0000>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "%) " + skill.GetAttribute() + ".", true); } else if (skill.GetLevel() >= skill.GetMaxLevel()) { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#00ff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Increase by <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "%) " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject2.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Increase by <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "%) " + skill.GetAttribute() + ".", true); } ((TMP_Text)skillButton.GetComponentInChildren<TextMeshProUGUI>()).SetText(skill.GetShortName() ?? "", true); } public void UpdateAllStats() { foreach (KeyValuePair<UpgradeType, Skill> skill in LP_NetworkManager.xpInstance.skillList.skills) { if (!skill.Value._teamShared) { GameObject skillButton = skillButtonsList.Find((GameObject x) => ((Object)x).name == skill.Value.GetShortName()); LoadSkillData(skill.Value, skillButton); } } } public void UpdateStatInfo(Skill skill) { //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Expected O, but got Unknown //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Expected O, but got Unknown //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Expected O, but got Unknown //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Expected O, but got Unknown //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Expected O, but got Unknown //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Expected O, but got Unknown //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Expected O, but got Unknown //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Expected O, but got Unknown //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Expected O, but got Unknown //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_0248: Expected O, but got Unknown //IL_0250: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Expected O, but got Unknown //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Expected O, but got Unknown if (!infoPanel.activeSelf) { infoPanel.SetActive(true); } TextMeshProUGUI component = ((Component)infoPanel.transform.GetChild(0)).gameObject.GetComponent<TextMeshProUGUI>(); TextMeshProUGUI component2 = ((Component)infoPanel.transform.GetChild(1)).gameObject.GetComponent<TextMeshProUGUI>(); TextMeshProUGUI component3 = ((Component)infoPanel.transform.GetChild(2)).gameObject.GetComponent<TextMeshProUGUI>(); activeSkill = skill; ((TMP_Text)component).SetText(skill.GetName(), true); ((TMP_Text)component2).SetText("", true); ((TMP_Text)component3).SetText(skill.GetDescription(), true); GameObject gameObject = ((Component)infoPanel.transform.GetChild(3)).gameObject; GameObject gameObject2 = ((Component)infoPanel.transform.GetChild(4)).gameObject; GameObject gameObject3 = ((Component)infoPanel.transform.GetChild(5)).gameObject; gameObject.GetComponent<Button>().onClick = new ButtonClickedEvent(); ((UnityEvent)gameObject.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { AddSkillPoint(skill, 5); }); gameObject2.GetComponent<Button>().onClick = new ButtonClickedEvent(); ((UnityEvent)gameObject2.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { AddSkillPoint(skill, 2); }); gameObject3.GetComponent<Button>().onClick = new ButtonClickedEvent(); ((UnityEvent)gameObject3.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { AddSkillPoint(skill, 1); }); GameObject gameObject4 = ((Component)infoPanel.transform.GetChild(6)).gameObject; GameObject gameObject5 = ((Component)infoPanel.transform.GetChild(7)).gameObject; GameObject gameObject6 = ((Component)infoPanel.transform.GetChild(8)).gameObject; gameObject4.GetComponent<Button>().onClick = new ButtonClickedEvent(); ((UnityEvent)gameObject4.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { RemoveSkillPoint(skill, 5); }); gameObject5.GetComponent<Button>().onClick = new ButtonClickedEvent(); ((UnityEvent)gameObject5.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { RemoveSkillPoint(skill, 2); }); gameObject6.GetComponent<Button>().onClick = new ButtonClickedEvent(); ((UnityEvent)gameObject6.GetComponent<Button>().onClick).AddListener((UnityAction)delegate { RemoveSkillPoint(skill, 1); }); } public void AddSkillPoint(Skill skill, int amt) { if (LP_NetworkManager.xpInstance.GetSkillPoints() <= 0) { return; } int skillPoints = LP_NetworkManager.xpInstance.GetSkillPoints(); if (skillPoints < amt) { amt = skillPoints; } if (skill.GetLevel() + amt > skill.GetMaxLevel()) { amt = skill.GetMaxLevel() - skill.GetLevel(); } LP_NetworkManager.xpInstance.SetSkillPoints(LP_NetworkManager.xpInstance.GetSkillPoints() - amt); skill.AddLevel(amt); UpdateStatInfo(skill); foreach (GameObject skillButtons in skillButtonsList) { if (((Object)skillButtons).name == skill.GetShortName()) { LoadSkillData(skill, skillButtons); } } } public void RemoveSkillPoint(Skill skill, int amt) { if (skill.GetLevel() == 0) { return; } int level = skill.GetLevel(); if (level < amt) { amt = level; } LP_NetworkManager.xpInstance.SetSkillPoints(LP_NetworkManager.xpInstance.GetSkillPoints() + amt); skill.AddLevel(-amt); UpdateStatInfo(skill); foreach (GameObject skillButtons in skillButtonsList) { if (((Object)skillButtons).name == skill.GetShortName()) { LoadSkillData(skill, skillButtons); } } } public void TeamLootHudUpdate(int newValue) { foreach (GameObject skillButtons in skillButtonsList) { if (!(((Object)skillButtons).name == " <color=#FF75FB>CHANCE</color>")) { continue; } Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Value]; LoadSkillData(skill, skillButtons); GameObject gameObject = ((Component)skillButtons.transform.GetChild(0)).gameObject; ((TMP_Text)gameObject.GetComponent<TextMeshProUGUI>()).SetText(skill.GetShortName(), true); GameObject gameObject2 = ((Component)skillButtons.transform.GetChild(1)).gameObject; ((TMP_Text)skillButtons.GetComponentInChildren<TextMeshProUGUI>()).SetText(skill.GetShortName() ?? "", true); float multiplier = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Value].GetMultiplier(); float num = (float)newValue * multiplier; GameObject gameObject3 = ((Component)skillButtons.transform.GetChild(2)).gameObject; if (bool.Parse(SkillConfig.hostConfig["Language used : Frensh / Langue utilisé : Français"])) { if (skill.GetMaxLevel() == 99999) { if (skill.GetLevel() == 0) { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "</color>] Augmente de <color=#ff0000>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Bonus d'équipe total : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "</color>] Augmente de <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Bonus d'équipe total : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } } else if (skill.GetLevel() == 0) { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Augmente de <color=#ff0000>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "% (Bonus d'équipe total : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } else if (skill.GetLevel() >= skill.GetMaxLevel()) { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#00ff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Augmente de <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "% (Bonus d'équipe total : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Augmente de <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "% (Bonus d'équipe total : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } } else if (skill.GetMaxLevel() == 99999) { if (skill.GetLevel() == 0) { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "</color>] Increases by <color=#ff0000>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Total Team Bonus : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "</color>] Increases by <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Total Team Bonus : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } } else if (skill.GetLevel() == 0) { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ff0000>" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Increases by <color=#ff0000>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "% (Total Team Bonus : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } else if (skill.GetLevel() >= skill.GetMaxLevel()) { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#00ff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Increases by <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "% (Total Team Bonus : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } else { ((TMP_Text)gameObject3.GetComponent<TextMeshProUGUI>()).SetText("[<color=#ffff00>+" + skill.GetLevel() + "/" + skill.GetMaxLevel() + "</color>] Increases by <color=#00ffff>" + (float)skill.GetLevel() * skill.GetMultiplier() + "%</color> (Max " + (float)skill.GetMaxLevel() * skill.GetMultiplier() + "% (Total Team Bonus : <color=#ff00ff>" + num + "%</color>) " + skill.GetAttribute() + ".", true); } LethalPlugin.Log.LogInfo((object)$"Setting team value hud to {num}"); } } } } namespace LethalProgression.Skills { public enum UpgradeType { HPRegen, Stamina, Battery, HandSlot, Value, Oxygen, JumpHeight, SprintSpeed, Strength, Resist, Critical, Vision, Wisdom, Doublejump, Nightvision, Perception } internal class SkillList { public static int OxyNoSpam = 0; public static string RespecText = "..."; public static string ConsT = "<color=#8A7B3F>CONSTITUTION</color>"; public static string ConsD = " <color=#8A7B3F>CONSTITUTION</color>"; public static string Cons = ": resistance to monster damage, (Max 90%)."; public static string VitaT = "<color=#00cc00>VITALITY</color>"; public static string VitaD = " <color=#00cc00>VITALITY</color>"; public static string Vita = ": passive health regeneration"; public static string EnduT = "<color=#FFAB00>STAMINA</color>"; public static string EnduD = " <color=#FFAB00>STAMINA</color>"; public static string Endu = ": the maximum amount of endurance"; public static string ViteT = "<color=#6DF0F9>SPEED</color>"; public static string ViteD = " <color=#6DF0F9>SPEED</color>"; public static string Vite = ": sprint speed"; public static string ForcT = "<color=#C4774A>STRENGTH</color>"; public static string ForcD = " <color=#C4774A>STRENGTH</color>"; public static string Forc = ": the ability to carry heavy loads"; public static string AgiT = "<color=#00FF80>AGILITY</color>"; public static string AgiD = " <color=#00FF80>AGILITY</color>"; public static string Agi = ": the height of the jumps"; public static string CritT = "<color=#ff4444>CRITICAL</color>"; public static string CritD = " <color=#ff4444>CRITICAL</color>"; public static string Crit = ": The chance of landing a critical hit with melee weapons"; public static string EnerT = "<color=#F2FC66>ENERGY</color>"; public static string EnerD = " <color=#F2FC66>ENERGY</color>"; public static string Ener = ": battery life"; public static string VisiT = "<color=#ccccff>VISION</color>"; public static string VisiD = " <color=#ccccff>VISION</color>"; public static string Visi = ": The duration and recharge speed of <color=#ACACE9>Vision nocturne</color> <color=#ff00ff>(Capacity requiered)</color>."; public static string OxygT = "<color=#3399FF>OXYGEN</color>"; public static string OxygD = " <color=#3399FF>OXYGEN</color>"; public static string Oxyg = ": the duration of breathing underwater"; public static string SpecT = "<color=#5341AB>SPECIAL</color>"; public static string SpecD = " <color=#5341AB>SPECIAL</color>"; public static string Spec = ": the quantity of transportable object"; public static string ChanT = "<color=#FF75FB>CHANCE</color>"; public static string ChanD = " <color=#FF75FB>CHANCE</color>"; public static string Chan = ": the value of the items to be collected"; public static string WisT = "<color=#ff007f>WISDOM</color>"; public static string WisD = " <color=#ff007f>WISDOM</color>"; public static string Wis = ": the additionnal exp gain to kill monsters"; public static string PerT = "<color=#330066>PERCEPTION</color>"; public static string PerD = " <color=#330066>PERCEPTION</color>"; public static string Per = "To unlock the <color=#330066>Perception</color> ability. Allows you to detect monsters more easily within a radius of " + int.Parse(SkillConfig.hostConfig["Perception : range / Perception : portée"]) + "m."; public static string DoubT = "<color=#00cc66>DOUBLEJUMP</color>"; public static string DoubD = " <color=#00cc66>DOUBLEJUMP</color>"; public static string Doub = "To unlock the <color=#00cc66>Double Jump</color> ability. Allows you to double jump (key configurable in the game options)."; public static string NighT = "<color=#ACACE9>NIGHTVISION</color>"; public static string NighD = " <color=#ACACE9>NIGHTVISION</color>"; public static string Nigh = "To unlock the <color=#ACACE9>Nightvision</color> ability. Allows you to temporarily activate night vision (key configurable in the game options)."; public Dictionary<UpgradeType, Skill> skills = new Dictionary<UpgradeType, Skill>(); public void CreateSkill(UpgradeType upgrade, string name, string description, string shortname, string attribute, int cost, int maxLevel, float multiplier, Action<int> callback = null, bool teamShared = false) { Skill value = new Skill(name, description, shortname, attribute, upgrade, cost, maxLevel, multiplier, callback, teamShared); skills.Add(upgrade, value); } public bool IsSkillListValid() { if (skills.Count == 0) { return false; } return true; } public bool IsSkillValid(UpgradeType upgrade) { if (!skills.ContainsKey(upgrade)) { if (!skills.ContainsKey(UpgradeType.Oxygen)) { if (OxyNoSpam == 0) { LethalPlugin.Log.LogInfo((object)("Skill " + upgrade.ToString() + " is not in the skill list!")); OxyNoSpam = 1; return false; } return false; } LethalPlugin.Log.LogInfo((object)("Skill " + upgrade.ToString() + " is not in the skill list!")); return false; } return true; } public Skill GetSkill(UpgradeType upgrade) { if (!IsSkillValid(upgrade)) { return null; } return skills[upgrade]; } public Dictionary<UpgradeType, Skill> GetSkills() { return skills; } public void InitializeSkills() { if (bool.Parse(SkillConfig.hostConfig["Language used : Frensh / Langue utilisé : Français"])) { if (bool.Parse(SkillConfig.hostConfig["Respe Only in the ship / Respé Uniquement dans le vaisseau"]) && !bool.Parse(SkillConfig.hostConfig["Respe disabled / Respé désactivé"])) { RespecText = "Vous pouvez ajouter des points de caractéristiques à tout moment. Pour modifier votre spécialisation vous devez être à bord du vaisseau."; } else if (bool.Parse(SkillConfig.hostConfig["Respe Only in orbit / Respé Uniquement en orbit"])) { RespecText = "Vous pouvez ajouter des points de caractéristiques à tout moment. Pour modifier votre spécialisation vous devez être en Orbit."; } else if (bool.Parse(SkillConfig.hostConfig["Respe disabled / Respé désactivé"])) { RespecText = "Vous pouvez ajouter des points de caractéristiques à tout moment. Toutefois, <color=#ff0000>Attention</color> ces choix sont définitifs et irréversibles."; } else { RespecText = "Vous pouvez modifier vos points de caractéristiques à tout moment."; } ConsT = "<color=#8A7B3F>CONSTITUTION</color>"; ConsD = " <color=#8A7B3F>CONSTITUTION</color>"; Cons = "la résistance aux dégats des monstres, (Max 90%)."; VitaT = "<color=#00cc00>VITALITE</color>"; VitaD = " <color=#00cc00>VITALITE</color>"; Vita = "la régénération de points de vie passif"; EnduT = "<color=#FFAB00>ENDURANCE</color>"; EnduD = " <color=#FFAB00>ENDURANCE</color>"; Endu = "la quantité d'endurance maximum"; ViteT = "<color=#6DF0F9>VITESSE</color>"; ViteD = " <color=#6DF0F9>VITESSE</color>"; Vite = "la vitesse de sprint"; ForcT = "<color=#C4774A>FORCE</color>"; ForcD = " <color=#C4774A>FORCE</color>"; Forc = "la capacité à porter des charges lourdes"; AgiT = "<color=#00FF80>AGILITE</color>"; AgiD = " <color=#00FF80>AGILITE</color>"; Agi = "la hauteur des sauts"; CritT = "<color=#ff4444>CRITIQUE</color>"; CritD = " <color=#ff4444>CRITIQUE</color>"; Crit = "Les chance de faire 1 coup critiques avec les armes de corps à corps"; EnerT = "<color=#F2FC66>ENERGIE</color>"; EnerD = " <color=#F2FC66>ENERGIE</color>"; Ener = "la durée des batteries"; VisiT = "<color=#ccccff>VISION</color>"; VisiD = " <color=#ccccff>VISION</color>"; Visi = "La durée et la vitesse de recharge de la <color=#ACACE9>Vision nocturne</color> <color=#ff00ff>(Capacité requise)</color>."; OxygT = "<color=#3399FF>OXYGENE</color>"; OxygD = " <color=#3399FF>OXYGENE</color>"; Oxyg = "la durée de respiration sous l'eau"; SpecT = "<color=#5341AB>SPECIAL</color>"; SpecD = " <color=#5341AB>SPECIAL</color>"; Spec = "la quantité d'objet transportable"; ChanT = "<color=#FF75FB>CHANCE</color>"; ChanD = " <color=#FF75FB>CHANCE</color>"; Chan = "la valeur des objets à collecter"; WisT = "<color=#ff007f>SAGESSE</color>"; WisD = " <color=#ff007f>SAGESSE</color>"; Wis = "l'exp bonus gagner en tuant des monstres"; PerT = "<color=#330066>PERCEPTION</color>"; PerD = " <color=#330066>PERCEPTION</color>"; Per = ": Pour débloquer la capacité de <color=#330066>Perception</color>. Permet de detecter les monstres plus facilement dans un rayon de " + int.Parse(SkillConfig.hostConfig["Perception : range / Perception : portée"]) + "m."; DoubT = "<color=#00cc66>DOUBLE-SAUT</color>"; DoubD = " <color=#00cc66>DOUBLE-SAUT</color>"; Doub = "Pour débloquer la capacité de <color=#00cc66>Double Saut</color>. Permet d'effectuer un double saut (touche configurable dans les options du jeu)."; NighT = "<color=#ACACE9>VISION-NUIT</color>"; NighD = " <color=#ACACE9>VISION-NUIT</color>"; Nigh = "Pour débloquer la capacité de <color=#ACACE9>Vision nocturne</color>. Permet d'activer temporairement la vision nocturne (touche configurable dans les options du jeu)."; } else if (bool.Parse(SkillConfig.hostConfig["Res