Decompiled source of LethalStatsLC v1.4.3
OrianaGames-Stats/LethalProgression.dll
Decompiled 3 days 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 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 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-Stats", 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-Stats", "Sounds"); 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(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.5f; 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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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 (!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 -= 6.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; NightvisionSpeed = Vision.visionspeedvalue; } } } [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 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"); xpNetworkObject.AddComponent<LC_XP>(); 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>(); LethalPlugin.Log.LogInfo((object)"XPHandler Initialized."); } } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("OrianaGames.LethalStats", "LethalStats", "1.4.3")] internal class LethalPlugin : BaseUnityPlugin { private const string modGUID = "OrianaGames.LethalStats"; private const string modName = "LethalStats"; private const string modVersion = "1.4.3"; private const string modAuthor = "Lunastellia"; public static AssetBundle skillBundle; public static AssetBundle UIBundle; 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.LethalStats"); val.PatchAll(); val.PatchAll(typeof(JumpForcePatch)); skillBundle = AssetBundle.LoadFromMemory(Resources.skillmenu); UIBundle = AssetBundle.LoadFromMemory(Resources.nightvision_ui); Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"LethalStats loaded."); foreach (KeyValuePair<string, PluginInfo> pluginInfo in Chainloader.PluginInfos) { if (pluginInfo.Value.Metadata.GUID.IndexOf("ReservedItem") >= 0) { ReservedSlots = true; } if (pluginInfo.Value.Metadata.GUID.IndexOf("mikestweaks") < 0) { continue; } ConfigEntryBase[] configEntries = pluginInfo.Value.Instance.Config.GetConfigEntries(); MikesTweaks = true; ConfigEntryBase[] array = configEntries; foreach (ConfigEntryBase val2 in array) { if (val2.Definition.Key == "ExtraItemSlots" && int.Parse(val2.GetSerializedValue()) > 0) { ReservedSlots = true; } } } 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."); HandSlots.UpdateHudSlots(); } 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 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.GUI { [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 Skill activeSkill; public GameObject templateSlot; public List<GameObject> skillButtonsList = new List<GameObject>(); public int shownSkills = 0; 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.385f, 0.385f, 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; } foreach (KeyValuePair<UpgradeType, Skill> skill in LP_NetworkManager.xpInstance.skillList.skills) { LethalPlugin.Log.LogInfo((object)("Creating button for " + skill.Value.GetShortName())); GameObject val = SetupUpgradeButton(skill.Value); LethalPlugin.Log.LogInfo((object)"Setup passed!"); skillButtonsList.Add(val); LethalPlugin.Log.LogInfo((object)"Added to skill list.."); LoadSkillData(skill.Value, val); } 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 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) { 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; 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 } internal class SkillList { public static int OxyNoSpam = 0; public static string RespecText = "..."; public static string DoubleJumpText = "..."; 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=#585B69>VISION</color>"; public static string VisiD = " <color=#585B69>VISION</color>"; public static string Visi = ": The duration and recharge speed of <color=#ccccff>Night Vision</color> <color=#ff00ff>(1)</color> Points required"; 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 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."; } if (bool.Parse(SkillConfig.hostConfig["Special Ability: Active Double Jump / Capacité spécial : Double Saut Actif"])) { if (int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]) == 0) { DoubleJumpText = "<color=#e5ffcc>, Double saut</color> <color=#00ff00>(Activé)</color>"; } else if (int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]) != 0) { if (int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]) >= int.Parse(SkillConfig.hostConfig["Agility Max / Agilité Max"])) { DoubleJumpText = "<color=#e5ffcc>, Double saut</color> <color=#ff00ff>(" + int.Parse(SkillConfig.hostConfig["Agility Max / Agilité Max"]) + ")</color> Points requis"; } else { DoubleJumpText = "<color=#e5ffcc>, Double saut</color> <color=#ff00ff>(" + int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]) + ")</color> Points requis"; } } } else { DoubleJumpText = "<color=#e5ffcc>, Double saut</color> <color=#ff0000>(Désactivé)</color>"; } 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=#585B69>VISION</color>"; VisiD = " <color=#585B69>VISION</color>"; Visi = "La durée et la vitesse de recharge de la <color=#ccccff>Vision nocturne</color> <color=#ff00ff>(1)</color> Points requis"; 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"; } else { 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 = "You can add attribute points at any time. To change your specialization, you must be on board the ship."; } else if (bool.Parse(SkillConfig.hostConfig["Respe Only in orbit / Respé Uniquement en orbit"])) { RespecText = "You can add attribute points at any time. To change your specialization, you must be in orbit."; } else if (bool.Parse(SkillConfig.hostConfig["Respe disabled / Respé désactivé"])) { RespecText = "You can add attribute points at any time. However, <color=#ff0000>Warning</color> these choices are final and irreversible."; } else { RespecText = "You can change your characteristic points at any time."; } if (bool.Parse(SkillConfig.hostConfig["Special Ability: Active Double Jump / Capacité spécial : Double Saut Actif"])) { if (int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]) == 0) { DoubleJumpText = "<color=#e5ffcc>, Double jump</color> <color=#00ff00>(Enable)</color>"; } else if (int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]) != 0) { if (int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]) >= int.Parse(SkillConfig.hostConfig["Agility Max / Agilité Max"])) { DoubleJumpText = "<color=#e5ffcc>, Double Jump</color> <color=#ff00ff>(" + int.Parse(SkillConfig.hostConfig["Agility Max / Agilité Max"]) + ")</color> Required points"; } else { DoubleJumpText = "<color=#e5ffcc>, Double Jump</color> <color=#ff00ff>(" + int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]) + ")</color> Required points"; } } } else { DoubleJumpText = "<color=#e5ffcc>, Double Jump</color> <color=#ff0000>(Disabled)</color>"; } } if (bool.Parse(SkillConfig.hostConfig["Constitution"])) { CreateSkill(UpgradeType.Resist, ConsT + "\n\n" + RespecText, " ", ConsD, Cons, 1, int.Parse(SkillConfig.hostConfig["Constitution Max"]), float.Parse(SkillConfig.hostConfig["Constitution : Bonus per level / Constitution : Bonus par niveau"], CultureInfo.InvariantCulture), Resistance.ResistanceUpdate); } if (bool.Parse(SkillConfig.hostConfig["Vitality / Vitalité"])) { LethalPlugin.Log.LogInfo((object)"HP Regen check 1"); CreateSkill(UpgradeType.HPRegen, VitaT + "\n\n" + RespecText, " ", VitaD, Vita, 1, int.Parse(SkillConfig.hostConfig["Vitality Max / Vitalité Max"]), float.Parse(SkillConfig.hostConfig["Vitality : Bonus per level / Vitalité : Bonus par niveau"], CultureInfo.InvariantCulture)); } if (bool.Parse(SkillConfig.hostConfig["Stamina / Endurance"])) { CreateSkill(UpgradeType.Stamina, EnduT + "\n\n" + RespecText, " ", EnduD, Endu, 1, int.Parse(SkillConfig.hostConfig["Stamina Max / Endurance Max"]), float.Parse(SkillConfig.hostConfig["Stamina : Bonus per level / Endurance : Bonus par niveau"], CultureInfo.InvariantCulture), Stamina.StaminaUpdate); } if (!LethalPlugin.MikesTweaks && bool.Parse(SkillConfig.hostConfig["Speed / Vitesse"])) { CreateSkill(UpgradeType.SprintSpeed, ViteT + "\n\n" + RespecText, " ", ViteD, Vite, 1, int.Parse(SkillConfig.hostConfig["Speed Max / Vitesse Max"]), float.Parse(SkillConfig.hostConfig["Speed : Bonus per level / Vitesse : Bonus par niveau"], CultureInfo.InvariantCulture), SprintSpeed.SprintSpeedUpdate); } if (bool.Parse(SkillConfig.hostConfig["Strenght / Force"])) { CreateSkill(UpgradeType.Strength, ForcT + "\n\n" + RespecText, " ", ForcD, Forc, 1, int.Parse(SkillConfig.hostConfig["Strenght Max / Force Max"]), float.Parse(SkillConfig.hostConfig["Strenght : Bonus per level / Force : Bonus par niveau"], CultureInfo.InvariantCulture), Strength.StrengthUpdate); } if (bool.Parse(SkillConfig.hostConfig["Agility / Agilité"])) { CreateSkill(UpgradeType.JumpHeight, AgiT + "\n\n" + RespecText, " ", AgiD, Agi + DoubleJumpText, 1, int.Parse(SkillConfig.hostConfig["Agility Max / Agilité Max"]), float.Parse(SkillConfig.hostConfig["Agility : Bonus per level / Agilité : Bonus par niveau"], CultureInfo.InvariantCulture), JumpHeight.JumpHeightUpdate); } if (bool.Parse(SkillConfig.hostConfig["Critical / Critique"])) { CreateSkill(UpgradeType.Critical, CritT + "\n\n" + RespecText, " ", CritD, Crit, 1, int.Parse(SkillConfig.hostConfig["Critical Max / Critique Max"]), float.Parse(SkillConfig.hostConfig["Critical : Bonus per level / Critique : Bonus par niveau"], CultureInfo.InvariantCulture), Critical.CriticalUpdate); } if (bool.Parse(SkillConfig.hostConfig["Energy / Energie"])) { CreateSkill(UpgradeType.Battery, EnerT + "\n\n" + RespecText, " ", EnerD, Ener, 1, int.Parse(SkillConfig.hostConfig["Energy Max / Energie Max"]), float.Parse(SkillConfig.hostConfig["Energy : Bonus per level / Energie : Bonus par niveau"], CultureInfo.InvariantCulture)); } if (bool.Parse(SkillConfig.hostConfig["Vision"])) { CreateSkill(UpgradeType.Vision, VisiT + "\n\n" + RespecText, " ", VisiD, Visi, 1, int.Parse(SkillConfig.hostConfig["Vision Max"]), float.Parse(SkillConfig.hostConfig["Vision : Bonus per level / Vision : Bonus par niveau"], CultureInfo.InvariantCulture), Vision.VisionUpdate); } if (bool.Parse(SkillConfig.hostConfig["Oxygen / Oxygene"])) { CreateSkill(UpgradeType.Oxygen, OxygT + "\n\n" + RespecText, " ", OxygD, Oxyg, 1, int.Parse(SkillConfig.hostConfig["Oxygen Max / Oxygene Max"]), float.Parse(SkillConfig.hostConfig["Oxygen : Bonus per level / Oxygene : Bonus par niveau"], CultureInfo.InvariantCulture)); } if (bool.Parse(SkillConfig.hostConfig["Chance"])) { CreateSkill(UpgradeType.Value, ChanT + "\n\n" + RespecText, " ", ChanD, Chan, 1, int.Parse(SkillConfig.hostConfig["Chance Max"]), float.Parse(SkillConfig.hostConfig["Chance : Bonus per level / Chance : Bonus par niveau"], CultureInfo.InvariantCulture), LootValue.LootValueUpdate, teamShared: true); } if (bool.Parse(SkillConfig.hostConfig["Special"]) && !LethalPlugin.ReservedSlots) { CreateSkill(UpgradeType.HandSlot, SpecT + "\n\n" + RespecText, " ", SpecD, Spec, 1, int.Parse(SkillConfig.hostConfig["Special Max"]), float.Parse(SkillConfig.hostConfig["Special : Bonus per level / Special : Bonus par niveau"], CultureInfo.InvariantCulture), HandSlots.HandSlotsUpdate); } } } internal class Skill { private readonly string _shortName; private readonly string _name; private readonly string _attribute; private readonly string _description; private readonly UpgradeType _upgradeType; private readonly int _cost; private readonly int _maxLevel; private readonly float _multiplier; private readonly Action<int> _callback; public bool _teamShared; private int _level; public Skill(string name, string description, string shortname, string attribute, UpgradeType upgradeType, int cost, int maxLevel, float multiplier, Action<int> callback = null, bool teamShared = false) { _name = name; _shortName = shortname; _attribute = attribute; _description = description; _upgradeType = upgradeType; _cost = cost; _maxLevel = maxLevel; _multiplier = multiplier; _level = 0; _callback = callback; _teamShared = teamShared; } public string GetName() { return _name; } public string GetShortName() { return _shortName; } public string GetAttribute() { return _attribute; } public string GetDescription() { return _description; } public UpgradeType GetUpgradeType() { return _upgradeType; } public int GetCost() { return _cost; } public int GetMaxLevel() { return _maxLevel; } public int GetLevel() { return _level; } public float GetMultiplier() { return _multiplier; } public float GetTrueValue() { return _multiplier * (float)_level; } public void SetLevel(int newLevel, bool triggerHostProfileSave = true) { int level = _level; _level = newLevel; _callback?.Invoke(newLevel - level); if (triggerHostProfileSave) { SaveManager.TriggerHostProfileSave(); } } public void AddLevel(int change) { _level += change; _callback?.Invoke(change); SaveManager.TriggerHostProfileSave(); } } [HarmonyPatch] internal class BatteryLife { [HarmonyPrefix] [HarmonyPatch(typeof(GrabbableObject), "SyncBatteryServerRpc")] public static void BatteryUpdate(ref int charge) { if (LP_NetworkManager.xpInstance.skillList.IsSkillListValid() && LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Battery) && charge == 100) { charge += (int)LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Battery].GetTrueValue(); } } } [HarmonyPatch] public static class Critical { [HarmonyPatch(typeof(GrabbableObject), "Start")] internal class GrabbableObjectPatch { public static void Prefix(GrabbableObject __instance) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (((object)__instance).GetType() == typeof(Shovel)) { Shovel val = (Shovel)((__instance is Shovel) ? __instance : null); itemDamage = val.shovelHitForce; ShovelPatch.SuperCritDamage = itemDamage * 3; ShovelPatch.CritDamage = itemDamage * 2; ShovelPatch.InitialDamage = itemDamage; LethalPlugin.Log.LogWarning((object)$"Dégats sauvegardé pour cette arme : [{100f - critvalue}%] Dégâts normaux x{ShovelPatch.InitialDamage}, [{critvalue - critvalue2}%] Coup Critique x{ShovelPatch.CritDamage}, [{critvalue2}%] x{ShovelPatch.SuperCritDamage} !"); } } } [HarmonyPatch(typeof(GrabbableObject), "EquipItem")] internal class EquipItemPatch { public static void Prefix(GrabbableObject __instance) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (((object)__instance).GetType() == typeof(Shovel)) { Shovel val = (Shovel)((__instance is Shovel) ? __instance : null); itemDamage = val.shovelHitForce; ShovelPatch.SuperCritDamage = itemDamage * 3; ShovelPatch.CritDamage = itemDamage * 2; ShovelPatch.InitialDamage = itemDamage; LethalPlugin.Log.LogWarning((object)$"Dégats sauvegardé pour cette arme : [{100f - critvalue}%] Dégâts normaux x{ShovelPatch.InitialDamage}, [{critvalue - critvalue2}%] Coup Critique x{ShovelPatch.CritDamage}, [{critvalue2}%] x{ShovelPatch.SuperCritDamage} !"); } } } [HarmonyPatch(typeof(Shovel), "SwingShovel")] public class ShovelPatch { public static readonly Random _random = new Random(); public static int SuperCritDamage = itemDamage * 3; public static int CritDamage = itemDamage * 2; public static int InitialDamage = itemDamage; private static bool CriticalHit; private static bool SuperCriticalHit; public static void Prefix(Shovel __instance, bool cancel = false) { CriticalHit = (float)_random.Next(1, 101) <= critvalue; if (!CriticalHit) { LethalPlugin.Log.LogWarning((object)$"Dégâts x{InitialDamage}."); __instance.shovelHitForce = InitialDamage; return; } SuperCriticalHit = (float)_random.Next(1, 101) <= critvalue; if (!SuperCriticalHit) { LethalPlugin.Log.LogWarning((object)$"Dégats x{CritDamage} Coup Critique !"); __instance.shovelHitForce = CritDamage; } else { LethalPlugin.Log.LogWarning((object)$"Dégats x{SuperCritDamage} Coup Critique !"); __instance.shovelHitForce = SuperCritDamage; } } public static void Postfix(Shovel __instance, bool cancel = false) { __instance.shovelHitForce = InitialDamage; } } [HarmonyPatch(typeof(KnifeItem), "ItemActivate")] public class KnifeItemPatch { public static readonly Random _random = new Random(); public static int CritDamage = 2; public static int InitialDamage = 1; private static bool CriticalHit; public static void Prefix(KnifeItem __instance, bool used, bool buttonDown = true) { CriticalHit = (float)_random.Next(1, 101) <= critvalue; if (!CriticalHit) { LethalPlugin.Log.LogWarning((object)$"Dégâts x{InitialDamage}."); __instance.knifeHitForce = InitialDamage; } else { LethalPlugin.Log.LogWarning((object)$"Dégats x{CritDamage} Coup Critique !"); __instance.knifeHitForce = CritDamage; } } } public static float critvalue = 0f; public static float Icrit = 0.01f; public static float critvalue2 = 0f; public static int itemDamage = 1; public static void CriticalUpdate(int updatedValue) { if (LP_NetworkManager.xpInstance.skillList.IsSkillListValid() && LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Critical)) { Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Critical]; PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController; float num = (float)updatedValue * skill.GetMultiplier(); critvalue += num; if (critvalue != 0f) { Icrit = (float)Math.Round(100f / critvalue, 2); critvalue2 = critvalue / Icrit; LethalPlugin.Log.LogInfo((object)$"{updatedValue} change, Adding {num} resulting in {critvalue}% Critical rate ({critvalue2}% x3) "); } else { LethalPlugin.Log.LogInfo((object)$"{updatedValue} change, Adding {num} resulting in {critvalue}% Critical rate !"); } } } } [HarmonyPatch(typeof(PlayerControllerB))] internal class JumpForcePatch { public static int reserveSaut = 1; public static int r_num = 0; public static int r_max = 0; public static int r_ajust = 0; public static string str = ""; public static bool config = false; [HarmonyPatch("Update")] [HarmonyPostfix] public static void jumpForcePatch(ref bool ___isExhausted, ref bool ___isJumping, ref float ___playerSlidingTimer, ref PlayerControllerB __instance, ref float ___sprintMeter, ref float ___jumpForce, ref bool ___isFallingNoJump, ref bool ___isFallingFromJump) { if (!bool.Parse(SkillConfig.hostConfig["Special Ability: Active Double Jump / Capacité spécial : Double Saut Actif"])) { return; } if (!config) { r_num = int.Parse(SkillConfig.hostConfig["Double Jump : agility required / Double Saut : agilité requise"]); r_max = int.Parse(SkillConfig.hostConfig["Agility Max / Agilité Max"]); config = true; LethalPlugin.Log.LogInfo((object)"CONFIG"); } if (r_num == 0 && r_ajust != r_num) { r_ajust = r_num; str = ""; LethalPlugin.Log.LogInfo((object)"CONFIG 0"); } else if (r_num >= r_max && r_ajust != r_max) { r_ajust = r_max; str = ", Double saut disponible (" + r_ajust + "/" + r_max + ") requis"; LethalPlugin.Log.LogInfo((object)$"CONFIG {r_ajust}"); } else if (r_num < r_max && r_ajust != r_num) { r_ajust = r_num; str = ", Double saut disponible (" + r_ajust + "/" + r_max + ") requis"; LethalPlugin.Log.LogInfo((object)$"CONFIG {r_ajust}"); } if (JumpHeight.savelevel >= r_ajust) { if (reserveSaut > 0 && !___isExhausted && (___isFallingNoJump | ___isFallingFromJump) && LethalPlugin.Input.DoubleJump.triggered) { reserveSaut--; LethalPlugin.Log.LogInfo((object)"Double Jump"); ((MonoBehaviour)__instance).StartCoroutine("PlayerJump"); ___sprintMeter = Mathf.Clamp(___sprintMeter - 0.08f, 0f, 1f); ___playerSlidingTimer = 0f; ___isJumping = true; } if (__instance.thisController.isGrounded) { reserveSaut = 1; } } } } internal class HandSlots { public static int currentSlotCount = 4; public static void HandSlotsUpdate(int updateValue) { if (!LethalPlugin.ReservedSlots && LP_NetworkManager.xpInstance.skillList.IsSkillListValid() && LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.HandSlot)) { LC_XP xpInstance = LP_NetworkManager.xpInstance; int num = (int)xpInstance.skillList.skills[UpgradeType.HandSlot].GetTrueValue(); int num2 = (int)Math.Floor((double)(num / 100)); ulong playerClientId = GameNetworkManager.Instance.localPlayerController.playerClientId; LethalPlugin.Log.LogInfo((object)$"Updating Player HandSlot {playerClientId}"); xpInstance.updateSPHandSlotsClientMessage.SendServer(num2); } } public static void UpdateHudSlots() { //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0222: 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_0297: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_02bc: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02d2: Unknown result type (might be due to invalid IL or missing references) LC_XP xpInstance = LP_NetworkManager.xpInstance; float num = xpInstance.skillList.skills[UpgradeType.HandSlot].GetTrueValue() / 100f; int num2 = 4 + (int)Math.Floor(num); int num3 = num2 - currentSlotCount; GameObject val = GameObject.Find("Systems/UI/Canvas/IngamePlayerHUD/Inventory"); List<string> list = new List<string> { "Slot0", "Slot1", "Slot2", "Slot3" }; for (int i = 0; i < val.transform.childCount; i++) { Transform child = val.transform.GetChild(i); if (!list.Contains(((Object)((Component)child).gameObject).name)) { Object.Destroy((Object)(object)((Component)child).gameObject); } } int num4 = (int)xpInstance.skillList.skills[UpgradeType.HandSlot].GetTrueValue(); int num5 = (int)Math.Floor((double)(num4 / 100)); Image[] array = (Image[])(object)new Image[num2]; array[0] = HUDManager.Instance.itemSlotIconFrames[0]; array[1] = HUDManager.Instance.itemSlotIconFrames[1]; array[2] = HUDManager.Instance.itemSlotIconFrames[2]; array[3] = HUDManager.Instance.itemSlotIconFrames[3]; Image[] array2 = (Image[])(object)new Image[num2]; array2[0] = HUDManager.Instance.itemSlotIcons[0]; array2[1] = HUDManager.Instance.itemSlotIcons[1]; array2[2] = HUDManager.Instance.itemSlotIcons[2]; array2[3] = HUDManager.Instance.itemSlotIcons[3]; GameObject val2 = GameObject.Find("Systems/UI/Canvas/IngamePlayerHUD/Inventory/Slot3"); GameObject templateSlot = xpInstance.guiObj.templateSlot; GameObject val3 = val2; currentSlotCount = num2; for (int j = 0; j < (int)num; j++) { GameObject val4 = Object.Instantiate<GameObject>(templateSlot); ((Object)val4).name = $"Slot{3 + (j + 1)}"; val4.transform.SetParent(val.transform); Vector3 localPosition = val3.transform.localPosition; val4.transform.SetLocalPositionAndRotation(new Vector3(localPosition.x + 50f, localPosition.y, localPosition.z), val3.transform.localRotation); val3 = val4; array[3 + (j + 1)] = val4.GetComponent<Image>(); array2[3 + (j + 1)] = ((Component)val4.transform.GetChild(0)).GetComponent<Image>(); val4.SetActive(true); } for (int k = 0; k < array.Length; k++) { Vector3 localPosition2 = ((Component)array[k]).transform.localPosition; ((Component)array[k]).transform.SetLocalPositionAndRotation(new Vector3(localPosition2.x - (float)(num3 * 25), localPosition2.y, localPosition2.z), ((Component)array[k]).transform.localRotation); } HUDManager.Instance.itemSlotIconFrames = array; HUDManager.Instance.itemSlotIcons = array2; } public static bool IsItemSwitchPossible(PlayerControllerB player) { return !player.inTerminalMenu && !player.isGrabbingObjectAnimation && !player.inSpecialInteractAnimation && !player.isTypingChat && !player.twoHanded && !player.activatingItem && !player.jetpackControls && !player.disablingJetpackControls; } public static bool SwitchItemSlots(PlayerControllerB player, int requestedSlot) { if (!IsItemSwitchPossible(player) || player.currentItemSlot == requestedSlot) { LethalPlugin.Log.LogDebug((object)"TEST"); return false; } LethalPlugin.Log.LogDebug((object)$"Trying to switch to slot {requestedSlot}"); int num = player.currentItemSlot - requestedSlot; bool flag = num > 0; if (Math.Abs(num) != player.ItemSlots.Length - 1) { do { num += ((!flag) ? 1 : (-1)); } while (num != 0); } ShipBuildModeManager.Instance.CancelBuildMode(true); player.playerBodyAnimator.SetBool("GrabValidated", false); LethalPlugin.Log.LogDebug((object)$"Switched to slot {requestedSlot}"); if ((Object)(object)player.currentlyHeldObjectServer != (Object)null) { ((Component)player.currentlyHeldObjectServer).gameObject.GetComponent<AudioSource>().PlayOneShot(player.currentlyHeldObjectServer.itemProperties.grabSFX, 0.6f); } return true; } } [HarmonyPatch] internal class HPRegen { [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "LateUpdate")] private static void HPRegenUpdate(PlayerControllerB __instance) { if (!((NetworkBehaviour)__instance).IsOwner || (((NetworkBehaviour)__instance).IsServer && !__instance.isHostPlayerObject) || !__instance.isPlayerControlled || __instance.health >= 100 || __instance.isPlayerDead || !LP_NetworkManager.xpInstance.skillList.IsSkillListValid() || !LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.HPRegen) || LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.HPRegen].GetLevel() == 0) { return; } if (__instance.healthRegenerateTimer <= 0f) { Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.HPRegen]; float trueValue = skill.GetTrueValue(); __instance.healthRegenerateTimer = 1f / trueValue; __instance.health++; if (__instance.health >= 20) { __instance.MakeCriticallyInjured(false); } HUDManager.Instance.UpdateHealthUI(__instance.health, false); } else { __instance.healthRegenerateTimer -= Time.deltaTime; } } } internal class JumpHeight { public static int savelevel; public static void JumpHeightUpdate(int updatedValue) { if (LP_NetworkManager.xpInstance.skillList.IsSkillListValid() && LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.JumpHeight)) { PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController; Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.JumpHeight]; PlayerJumpHeightData playerJumpHeightData = new PlayerJumpHeightData { clientId = localPlayerController.playerClientId, jumpSkillValue = skill.GetLevel() }; savelevel = skill.GetLevel(); LethalPlugin.Log.LogInfo((object)$"Jump skill now {skill.GetLevel()} sending to Server"); LP_NetworkManager.xpInstance.updatePlayerJumpForceClientMessage.SendServer(playerJumpHeightData); } } } [HarmonyPatch] internal class LootValue { [HarmonyPrefix] [HarmonyPatch(typeof(RoundManager), "SpawnScrapInLevel")] private static void AddLootValue() { if (LP_NetworkManager.xpInstance.skillList.IsSkillListValid() && LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Value)) { float multiplier = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Value].GetMultiplier(); float num = (float)LP_NetworkManager.xpInstance.teamLootLevel.Value * multiplier; float num2 = num / 100f; try { RoundManager instance = RoundManager.Instance; instance.scrapValueMultiplier += num2; } catch { } LethalPlugin.Log.LogDebug((object)$"Added {num2} to scrap value multiplier, resulting in {RoundManager.Instance.scrapValueMultiplier}"); } } public static void LootValueUpdate(int change) { if (LP_NetworkManager.xpInstance.skillList.IsSkillListValid() && LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Value)) { LP_NetworkManager.xpInstance.updateTeamLootLevelClientMessage.SendServer(change); } } } [HarmonyPatch] internal class Oxygen { private static GameObject oxygenBar; private static float oxygen = 0f; private static float oxygenTimer = 0f; private static bool inWater = false; private static bool canDrown = true; [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "SetFaceUnderwaterClientRpc")] private static void EnteredWater(PlayerControllerB __instance) { inWater = true; } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "SetFaceOutOfWaterClientRpc")] private static void LeftWater(PlayerControllerB __instance) { inWater = false; } [HarmonyPrefix] [HarmonyPatch(typeof(PlayerControllerB), "SetFaceUnderwaterFilters")] private static void ShouldDrown(PlayerControllerB __instance) { if (!canDrown) { StartOfRound.Instance.drowningTimer = 99f; } } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "LateUpdate")] private static void OxygenUpdate(PlayerControllerB __instance) { if (!Object.op_Implicit((Object)(object)LP_NetworkManager.xpInstance) || !LP_NetworkManager.xpInstance.skillList.IsSkillListValid() || !LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Oxygen)) { return; } if (__instance.isPlayerDead) { if (Object.op_Implicit((Object)(object)oxygenBar)) { oxygenBar.SetActive(false); } return; } if (LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Oxygen].GetLevel() == 0) { if (Object.op_Implicit((Object)(object)oxygenBar)) { oxygenBar.SetActive(false); } if (!canDrown) { canDrown = true; StartOfRound.Instance.drowningTimer = 1f; } return; } if (!Object.op_Implicit((Object)(object)oxygenBar)) { CreateOxygenBar(); } Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Oxygen]; float trueValue = skill.GetTrueValue(); if (inWater) { oxygenBar.SetActive(true); if (oxygenTimer <= 0f) { oxygenTimer = 0.1f; if (oxygen > 0f) { oxygen -= 0.1f; } else if (!canDrown) { canDrown = true; StartOfRound.Instance.drowningTimer = 1f; } } else { oxygenTimer -= Time.deltaTime; } } if (!inWater) { if (oxygenTimer <= 0f) { oxygenTimer = 0.1f; if (oxygen < trueValue) { oxygenBar.SetActive(true); oxygen += 0.1f; canDrown = false; } else { oxygenBar.SetActive(false); } } else { oxygenTimer -= Time.deltaTime; } } if (oxygen > trueValue) { oxygenBar.SetActive(false); oxygen = trueValue; } if (oxygenBar.activeSelf) { float fillAmount = oxygen / trueValue; ((Component)oxygenBar.transform.GetChild(0).GetChild(0)).GetComponent<Image>().fillAmount = fillAmount; } } public static void CreateOxygenBar() { oxygenBar = Object.Instantiate<GameObject>(LethalPlugin.skillBundle.LoadAsset<GameObject>("OxygenBar")); oxygenBar.SetActive(false); } } [HarmonyPatch] internal class Resistance { public static void ResistanceUpdate(int updatedValue) { if (LP_NetworkManager.xpInstance.skillList.IsSkillListValid() && LP_NetworkManager.xpInstance.skillList.IsSkillValid(UpgradeType.Resist)) { Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Resist]; float num = skill.GetMultiplier() * (float)skill.GetLevel(); PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController; float num2 = 0.5f; float num3 = 100f - num; float num4 = num2 * num3; float num5 = (int)Math.Round(num4); LethalPlugin.Log.LogInfo((object)$"{updatedValue} change, reduction {num} / {num3}% - fake new damage (base 50) {num5} = {num5}."); } } [HarmonyPatch(typeof(PlayerControllerB), "DamagePlayer")] [HarmonyPrefix] public static void DamagePlayer(PlayerControllerB __instance, ref int damageNumber, bool hasDamageSFX, bool callRPC, CauseOfDeath causeOfDeath, int deathAnimation, bool fallDamage, Vector3 force) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Invalid comparison between Unknown and I4 try { Skill skill = LP_NetworkManager.xpInstance.skillList.skills[UpgradeType.Resist]; float num = skill.GetMu