Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of ValheimPlus Grantapher Temporary v9.17.1
BepInEx/plugins/ValheimPlus.dll
Decompiled 3 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Timers; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using IniParser; using IniParser.Exceptions; using IniParser.Model; using IniParser.Model.Configuration; using IniParser.Model.Formatting; using IniParser.Parser; using JetBrains.Annotations; using Microsoft.CodeAnalysis; using PlayFab.MultiplayerModels; using PlayFab.Party; using ServerSync; using Splatform; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; using Valheim.SettingsGui; using ValheimPlus.Configurations; using ValheimPlus.Configurations.Sections; using ValheimPlus.GameClasses; using ValheimPlus.Http; using ValheimPlus.RPC; using ValheimPlus.UI; using ValheimPlus.Utility; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("ValheimPlus")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ValheimPlus")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("2a837100-a030-4d0c-bffb-b38356118d9a")] [assembly: AssemblyFileVersion("0.9.17.1")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.9.17.1")] [module: UnverifiableCode] public static class ZNetExtensions { public enum ZNetInstanceType { Local, Client, Server } public static bool IsLocalInstance(this ZNet znet) { return znet.IsServer() && !znet.IsDedicated(); } public static bool IsClientInstance(this ZNet znet) { return !znet.IsServer() && !znet.IsDedicated(); } public static bool IsServerInstance(this ZNet znet) { return znet.IsServer() && znet.IsDedicated(); } public static ZNetInstanceType GetInstanceType(this ZNet znet) { if (znet.IsLocalInstance()) { return ZNetInstanceType.Local; } if (znet.IsClientInstance()) { return ZNetInstanceType.Client; } return ZNetInstanceType.Server; } } namespace ValheimPlus { internal class ABM { public static bool isActive; private static Player PlayerInstance; private static bool controlFlag; private static bool shiftFlag; private static bool altFlag; public static bool exitOnNextIteration; private static Piece component; private const float BASE_TRANSLATION_DISTANCE = 0.1f; private const float BASE_ROTATION_ANGLE_DEGREES = 3f; private static float currentModificationSpeed = 1f; private const float MIN_MODIFICATION_SPEED = 1f; private const float MAX_MODIFICATION_SPEED = 30f; private static Quaternion savedRotation; public static void Run(ref Player __instance) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) PlayerInstance = __instance; if (AEM.isActive) { if (isActive) { exitMode(); } return; } if (Input.GetKeyDown(Configuration.Current.AdvancedBuildingMode.exitAdvancedBuildingMode)) { if (isActive) { exitMode(); } return; } if (exitOnNextIteration) { isActive = false; exitOnNextIteration = false; component = null; } if (isActive && (Object)(object)component == (Object)null) { exitMode(); } else if ((Object)(object)selectedPrefab() == (Object)null || (Object)(object)PlayerInstance.m_placementGhost == (Object)null) { if (isActive) { exitMode(); } } else if (isInBuildMode() && IsHoeOrTerrainTool(selectedPrefab())) { if (isActive) { exitMode(); } } else if (isActive) { if (Vector3.Distance(((Component)PlayerInstance).transform.position, ((Component)component).transform.position) > PlayerInstance.m_maxPlaceDistance) { exitMode(); } isRunning(); listenToHotKeysAndDoWork(); } else if (Input.GetKeyDown(Configuration.Current.AdvancedBuildingMode.enterAdvancedBuildingMode)) { startMode(); } } private static void listenToHotKeysAndDoWork() { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: 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_02c8: Unknown result type (might be due to invalid IL or missing references) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_022f: 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) //IL_023e: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_03e6: Unknown result type (might be due to invalid IL or missing references) //IL_03ed: Unknown result type (might be due to invalid IL or missing references) //IL_03c6: Unknown result type (might be due to invalid IL or missing references) //IL_03cd: Unknown result type (might be due to invalid IL or missing references) //IL_0341: Unknown result type (might be due to invalid IL or missing references) //IL_0355: Unknown result type (might be due to invalid IL or missing references) //IL_036d: Unknown result type (might be due to invalid IL or missing references) //IL_0377: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_0316: Unknown result type (might be due to invalid IL or missing references) //IL_0324: Unknown result type (might be due to invalid IL or missing references) //IL_0329: Unknown result type (might be due to invalid IL or missing references) //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_0470: Unknown result type (might be due to invalid IL or missing references) //IL_0477: Unknown result type (might be due to invalid IL or missing references) //IL_0441: Unknown result type (might be due to invalid IL or missing references) //IL_0448: Unknown result type (might be due to invalid IL or missing references) //IL_0421: Unknown result type (might be due to invalid IL or missing references) //IL_0428: Unknown result type (might be due to invalid IL or missing references) //IL_049e: Unknown result type (might be due to invalid IL or missing references) //IL_04a5: Unknown result type (might be due to invalid IL or missing references) float num = 0f; float num2 = 0f; float num3 = 0f; if (Input.GetKeyDown((KeyCode)306)) { controlFlag = true; } if (Input.GetKeyUp((KeyCode)306)) { controlFlag = false; } if (Input.GetKeyDown((KeyCode)304)) { shiftFlag = true; } if (Input.GetKeyUp((KeyCode)304)) { shiftFlag = false; } if (Input.GetKeyDown((KeyCode)308)) { altFlag = true; } if (Input.GetKeyUp((KeyCode)308)) { altFlag = false; } changeModificationSpeed(); if (Input.GetKeyUp(Configuration.Current.AdvancedBuildingMode.copyObjectRotation)) { savedRotation = ((Component)component).transform.rotation; } if (Input.GetKeyUp(Configuration.Current.AdvancedBuildingMode.pasteObjectRotation)) { ((Component)component).transform.rotation = savedRotation; } float num4 = 3f * currentModificationSpeed; if (Input.GetAxis("Mouse ScrollWheel") > 0f) { Quaternion rotation; if (controlFlag) { num += 1f; rotation = Quaternion.Euler(((Component)component).transform.eulerAngles.x + num4 * num, ((Component)component).transform.eulerAngles.y, ((Component)component).transform.eulerAngles.z); } else if (altFlag) { num2 += 1f; rotation = Quaternion.Euler(((Component)component).transform.eulerAngles.x, ((Component)component).transform.eulerAngles.y, ((Component)component).transform.eulerAngles.z + num4 * num2); } else { num3 += 1f; rotation = Quaternion.Euler(((Component)component).transform.eulerAngles.x, ((Component)component).transform.eulerAngles.y + num4 * num3, ((Component)component).transform.eulerAngles.z); } ((Component)component).transform.rotation = rotation; } if (Input.GetAxis("Mouse ScrollWheel") < 0f) { Quaternion rotation2; if (controlFlag) { num -= 1f; rotation2 = Quaternion.Euler(((Component)component).transform.eulerAngles.x + num4 * num, ((Component)component).transform.eulerAngles.y, ((Component)component).transform.eulerAngles.z); } else if (altFlag) { num2 -= 1f; rotation2 = Quaternion.Euler(((Component)component).transform.eulerAngles.x, ((Component)component).transform.eulerAngles.y, ((Component)component).transform.eulerAngles.z + num4 * num2); } else { num3 -= 1f; rotation2 = Quaternion.Euler(((Component)component).transform.eulerAngles.x, ((Component)component).transform.eulerAngles.y + num4 * num3, ((Component)component).transform.eulerAngles.z); } ((Component)component).transform.rotation = rotation2; } float num5 = 0.1f * currentModificationSpeed; if (Input.GetKeyDown((KeyCode)273)) { if (controlFlag) { ((Component)component).transform.Translate(Vector3.up * num5); } else { ((Component)component).transform.Translate(Vector3.forward * num5); } } if (Input.GetKeyDown((KeyCode)274)) { if (controlFlag) { ((Component)component).transform.Translate(Vector3.down * num5); } else { ((Component)component).transform.Translate(Vector3.back * num5); } } if (Input.GetKeyDown((KeyCode)276)) { ((Component)component).transform.Translate(Vector3.left * num5); } if (Input.GetKeyDown((KeyCode)275)) { ((Component)component).transform.Translate(Vector3.right * num5); } try { isValidPlacement(); } catch { } } private static void isValidPlacement() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Invalid comparison between Unknown and I4 //IL_01d0: Unknown result type (might be due to invalid IL or missing references) PlayerInstance.m_placementStatus = (PlacementStatus)0; if (component.m_groundOnly || component.m_groundPiece || component.m_cultivatedGroundOnly) { PlayerInstance.m_placementMarkerInstance.SetActive(false); } StationExtension val = ((Component)component).GetComponent<StationExtension>(); if ((Object)(object)val != (Object)null) { CraftingStation val2 = val.FindClosestStationInRange(((Component)component).transform.position); if (Object.op_Implicit((Object)(object)val2)) { val.StartConnectionEffect(val2, 1f); } else { val.StopConnectionEffect(); PlayerInstance.m_placementStatus = (PlacementStatus)7; } if (val.OtherExtensionInRange(component.m_spaceRequirement)) { PlayerInstance.m_placementStatus = (PlacementStatus)5; } } if (component.m_onlyInTeleportArea && !Object.op_Implicit((Object)(object)EffectArea.IsPointInsideArea(((Component)component).transform.position, (Type)16, 0f))) { PlayerInstance.m_placementStatus = (PlacementStatus)6; } if (!component.m_allowedInDungeons && ((Component)component).transform.position.y > 3000f) { PlayerInstance.m_placementStatus = (PlacementStatus)11; } if (Location.IsInsideNoBuildLocation(PlayerInstance.m_placementGhost.transform.position)) { PlayerInstance.m_placementStatus = (PlacementStatus)3; } float num = (Object.op_Implicit((Object)(object)((Component)component).GetComponent<PrivateArea>()) ? ((Component)component).GetComponent<PrivateArea>().m_radius : 0f); if (!PrivateArea.CheckAccess(PlayerInstance.m_placementGhost.transform.position, num, true, false)) { PlayerInstance.m_placementStatus = (PlacementStatus)4; } if ((int)PlayerInstance.m_placementStatus > 0) { component.SetInvalidPlacementHeightlight(true); } else { component.SetInvalidPlacementHeightlight(false); } } private static void startMode() { notifyUser("Starting ABM", (MessageType)1); isActive = true; component = PlayerInstance.m_placementGhost.GetComponent<Piece>(); } private static void exitMode() { notifyUser("Exiting ABM", (MessageType)1); exitOnNextIteration = true; isActive = false; component = null; } private static bool isInBuildMode() { return ((Character)PlayerInstance).InPlaceMode(); } private static GameObject selectedPrefab() { if ((Object)(object)PlayerInstance.m_buildPieces != (Object)null) { try { return PlayerInstance.m_buildPieces.GetSelectedPrefab(); } catch { return null; } } return null; } private static bool IsHoeOrTerrainTool(GameObject selectedPrefab) { string[] source = new string[4] { "paved_road", "mud_road", "raise", "path" }; string[] source2 = new string[2] { "cultivate", "replant" }; if (((Object)selectedPrefab).name.ToLower().Contains("sapling")) { return true; } if (source.Contains(((Object)selectedPrefab).name) || source2.Contains(((Object)selectedPrefab).name)) { return true; } return false; } private static void notifyUser(string Message, MessageType position = 1) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) MessageHud.instance.ShowMessage(position, "ABM: " + Message, 0, (Sprite)null, false); } private static void isRunning() { if (isActive) { MessageHud.instance.ShowMessage((MessageType)2, "ABM is active", 0, (Sprite)null, false); } } private static void changeModificationSpeed() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) float num = 1f; if (shiftFlag) { num = 10f; } if (Input.GetKeyDown(Configuration.Current.AdvancedBuildingMode.increaseScrollSpeed)) { currentModificationSpeed = Mathf.Clamp(currentModificationSpeed + num, 1f, 30f); notifyUser("Modification Speed: " + currentModificationSpeed, (MessageType)1); } if (Input.GetKeyDown(Configuration.Current.AdvancedBuildingMode.decreaseScrollSpeed)) { currentModificationSpeed = Mathf.Clamp(currentModificationSpeed - num, 1f, 30f); notifyUser("Modification Speed: " + currentModificationSpeed, (MessageType)1); } } } internal class AEM { public static bool isActive; public static Player PlayerInstance; private static bool controlFlag; private static bool shiftFlag; private static bool altFlag; public static Vector3 HitPoint; public static Vector3 HitNormal; public static Piece HitPiece; public static GameObject HitObject; public static Heightmap HitHeightmap; private static Quaternion InitialRotation; private static Vector3 InitialPosition; private static bool isInExistence; private const float BASE_TRANSLATION_DISTANCE = 0.1f; private const float BASE_ROTATION_ANGLE_DEGREES = 3f; private static float currentModificationSpeed = 1f; private const float MIN_MODIFICATION_SPEED = 1f; private const float MAX_MODIFICATION_SPEED = 30f; private static Quaternion savedRotation; public static bool forceExitNextIteration; public static bool ExecuteRayCast(Player playerInstance) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) int placeRayMask = playerInstance.m_placeRayMask; RaycastHit val = default(RaycastHit); if (Physics.Raycast(((Component)GameCamera.instance).transform.position, ((Component)GameCamera.instance).transform.forward, ref val, 50f, placeRayMask) && Object.op_Implicit((Object)(object)((RaycastHit)(ref val)).collider) && !Object.op_Implicit((Object)(object)((RaycastHit)(ref val)).collider.attachedRigidbody) && Vector3.Distance(Helper.getPlayerCharacter(playerInstance).m_eye.position, ((RaycastHit)(ref val)).point) < playerInstance.m_maxPlaceDistance) { HitPoint = ((RaycastHit)(ref val)).point; HitNormal = ((RaycastHit)(ref val)).normal; HitPiece = ((Component)((RaycastHit)(ref val)).collider).GetComponentInParent<Piece>(); HitObject = ((Component)((RaycastHit)(ref val)).collider).gameObject; HitHeightmap = ((Component)((RaycastHit)(ref val)).collider).GetComponent<Heightmap>(); InitialRotation = ((Component)HitPiece).transform.rotation; InitialPosition = ((Component)HitPiece).transform.position; return isValidRayCastTarget(); } resetObjectInfo(); return false; } public static bool checkForObject() { if ((Object)(object)PlayerInstance == (Object)null) { return false; } if (!ExecuteRayCast(PlayerInstance)) { return false; } return true; } public static void run() { //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) if (forceExitNextIteration) { forceExitNextIteration = false; resetObjectInfo(); isActive = false; return; } if (isInBuildMode()) { if (isActive) { exitMode(); resetObjectTransform(); } return; } if (ABM.isActive) { if (isActive) { exitMode(); resetObjectTransform(); } return; } if (!isActive && Input.GetKeyDown(Configuration.Current.AdvancedEditingMode.enterAdvancedEditingMode)) { if (checkForObject()) { startMode(); } return; } if (Input.GetKeyDown(Configuration.Current.AdvancedEditingMode.abortAndExitAdvancedEditingMode)) { exitMode(); resetObjectTransform(); } if (!isActive) { return; } if (hitPieceStillExists()) { try { ZNetView component = ((Component)HitPiece).GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null) { ValheimPlusPlugin.Logger.LogWarning((object)"AEM: Error, network object empty. Code: 2."); exitMode(); return; } } catch { ValheimPlusPlugin.Logger.LogWarning((object)"AEM: Error, network object empty. Code: 3."); exitMode(); } isRunning(); listenToHotKeysAndDoWork(); } else { exitMode(); } } private static void listenToHotKeysAndDoWork() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: 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_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_0254: Unknown result type (might be due to invalid IL or missing references) //IL_022f: 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_02db: Unknown result type (might be due to invalid IL or missing references) //IL_02ef: Unknown result type (might be due to invalid IL or missing references) //IL_02f9: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_0401: Unknown result type (might be due to invalid IL or missing references) //IL_0419: Unknown result type (might be due to invalid IL or missing references) //IL_042d: Unknown result type (might be due to invalid IL or missing references) //IL_0437: Unknown result type (might be due to invalid IL or missing references) //IL_043c: Unknown result type (might be due to invalid IL or missing references) //IL_0377: Unknown result type (might be due to invalid IL or missing references) //IL_038b: Unknown result type (might be due to invalid IL or missing references) //IL_03a3: Unknown result type (might be due to invalid IL or missing references) //IL_03ad: Unknown result type (might be due to invalid IL or missing references) //IL_03b2: Unknown result type (might be due to invalid IL or missing references) //IL_0324: Unknown result type (might be due to invalid IL or missing references) //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) //IL_035a: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) //IL_03bf: Unknown result type (might be due to invalid IL or missing references) //IL_055a: Unknown result type (might be due to invalid IL or missing references) //IL_0561: Unknown result type (might be due to invalid IL or missing references) //IL_053a: Unknown result type (might be due to invalid IL or missing references) //IL_0541: Unknown result type (might be due to invalid IL or missing references) //IL_04b5: Unknown result type (might be due to invalid IL or missing references) //IL_04c9: Unknown result type (might be due to invalid IL or missing references) //IL_04e1: Unknown result type (might be due to invalid IL or missing references) //IL_04eb: Unknown result type (might be due to invalid IL or missing references) //IL_04f0: Unknown result type (might be due to invalid IL or missing references) //IL_0462: Unknown result type (might be due to invalid IL or missing references) //IL_0476: Unknown result type (might be due to invalid IL or missing references) //IL_048a: Unknown result type (might be due to invalid IL or missing references) //IL_0498: Unknown result type (might be due to invalid IL or missing references) //IL_049d: Unknown result type (might be due to invalid IL or missing references) //IL_04fd: Unknown result type (might be due to invalid IL or missing references) //IL_05e4: Unknown result type (might be due to invalid IL or missing references) //IL_05eb: Unknown result type (might be due to invalid IL or missing references) //IL_05b5: Unknown result type (might be due to invalid IL or missing references) //IL_05bc: Unknown result type (might be due to invalid IL or missing references) //IL_0595: Unknown result type (might be due to invalid IL or missing references) //IL_059c: Unknown result type (might be due to invalid IL or missing references) //IL_0612: Unknown result type (might be due to invalid IL or missing references) //IL_0619: Unknown result type (might be due to invalid IL or missing references) float num = 0f; float num2 = 0f; float num3 = 0f; if (Input.GetKeyDown(Configuration.Current.AdvancedEditingMode.resetAdvancedEditingMode)) { resetObjectTransform(); } if (Input.GetKeyDown(Configuration.Current.AdvancedEditingMode.confirmPlacementOfAdvancedEditingMode)) { if (isContainer()) { dropContainerContents(); } GameObject val = Object.Instantiate<GameObject>(((Component)HitPiece).gameObject, ((Component)HitPiece).transform.position, ((Component)HitPiece).transform.rotation); HitPiece.m_placeEffect.Create(((Component)HitPiece).transform.position, ((Component)HitPiece).transform.rotation, val.transform, 1f, -1); ZNetView component = ((Component)HitPiece).GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null) { ValheimPlusPlugin.Logger.LogWarning((object)"AEM: Error, network object empty."); resetObjectTransform(); exitMode(); } else { component.ClaimOwnership(); ZNetScene.instance.Destroy(((Component)HitPiece).gameObject); ValheimPlusPlugin.Logger.LogInfo((object)"AEM: Executed."); exitMode(); } return; } if (Input.GetKeyDown((KeyCode)306)) { controlFlag = true; } if (Input.GetKeyUp((KeyCode)306)) { controlFlag = false; } if (Input.GetKeyDown((KeyCode)304)) { shiftFlag = true; } if (Input.GetKeyUp((KeyCode)304)) { shiftFlag = false; } if (Input.GetKeyDown((KeyCode)308)) { altFlag = true; } if (Input.GetKeyUp((KeyCode)308)) { altFlag = false; } changeModificationSpeed(); if (Input.GetKeyUp(Configuration.Current.AdvancedEditingMode.copyObjectRotation)) { savedRotation = ((Component)HitPiece).transform.rotation; } if (Input.GetKeyUp(Configuration.Current.AdvancedEditingMode.pasteObjectRotation)) { ((Component)HitPiece).transform.rotation = savedRotation; } if (Vector3.Distance(((Component)PlayerInstance).transform.position, ((Component)HitPiece).transform.position) > PlayerInstance.m_maxPlaceDistance) { resetObjectTransform(); exitMode(); } float num4 = 3f * currentModificationSpeed; if (Input.GetAxis("Mouse ScrollWheel") > 0f) { Quaternion rotation; if (controlFlag) { num += 1f; rotation = Quaternion.Euler(((Component)HitPiece).transform.eulerAngles.x + num4 * num, ((Component)HitPiece).transform.eulerAngles.y, ((Component)HitPiece).transform.eulerAngles.z); } else if (altFlag) { num2 += 1f; rotation = Quaternion.Euler(((Component)HitPiece).transform.eulerAngles.x, ((Component)HitPiece).transform.eulerAngles.y, ((Component)HitPiece).transform.eulerAngles.z + num4 * num2); } else { num3 += 1f; rotation = Quaternion.Euler(((Component)HitPiece).transform.eulerAngles.x, ((Component)HitPiece).transform.eulerAngles.y + num4 * num3, ((Component)HitPiece).transform.eulerAngles.z); } ((Component)HitPiece).transform.rotation = rotation; } if (Input.GetAxis("Mouse ScrollWheel") < 0f) { Quaternion rotation2; if (controlFlag) { num -= 1f; rotation2 = Quaternion.Euler(((Component)HitPiece).transform.eulerAngles.x + num4 * num, ((Component)HitPiece).transform.eulerAngles.y, ((Component)HitPiece).transform.eulerAngles.z); } else if (altFlag) { num2 -= 1f; rotation2 = Quaternion.Euler(((Component)HitPiece).transform.eulerAngles.x, ((Component)HitPiece).transform.eulerAngles.y, ((Component)HitPiece).transform.eulerAngles.z + num4 * num2); } else { num3 -= 1f; rotation2 = Quaternion.Euler(((Component)HitPiece).transform.eulerAngles.x, ((Component)HitPiece).transform.eulerAngles.y + num4 * num3, ((Component)HitPiece).transform.eulerAngles.z); } ((Component)HitPiece).transform.rotation = rotation2; } float num5 = 0.1f * currentModificationSpeed; if (Input.GetKeyDown((KeyCode)273)) { if (controlFlag) { ((Component)HitPiece).transform.Translate(Vector3.up * num5); } else { ((Component)HitPiece).transform.Translate(Vector3.forward * num5); } } if (Input.GetKeyDown((KeyCode)274)) { if (controlFlag) { ((Component)HitPiece).transform.Translate(Vector3.down * num5); } else { ((Component)HitPiece).transform.Translate(Vector3.back * num5); } } if (Input.GetKeyDown((KeyCode)276)) { ((Component)HitPiece).transform.Translate(Vector3.left * num5); } if (Input.GetKeyDown((KeyCode)275)) { ((Component)HitPiece).transform.Translate(Vector3.right * num5); } } private static bool hitPieceStillExists() { try { if (isActive) { isInExistence = true; } } catch { isInExistence = false; } return isInExistence; } private static bool isValidRayCastTarget() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) bool result = true; if (HitPiece.m_onlyInTeleportArea && !Object.op_Implicit((Object)(object)EffectArea.IsPointInsideArea(((Component)HitPiece).transform.position, (Type)16, 0f))) { result = false; } if (!HitPiece.m_allowedInDungeons && ((Component)HitPiece).transform.position.y > 3000f) { result = false; } if (Location.IsInsideNoBuildLocation(((Component)HitPiece).transform.position)) { result = false; } float num = (Object.op_Implicit((Object)(object)((Component)HitPiece).GetComponent<PrivateArea>()) ? ((Component)HitPiece).GetComponent<PrivateArea>().m_radius : 0f); if (!PrivateArea.CheckAccess(((Component)HitPiece).transform.position, num, true, false)) { result = false; } return result; } private static bool isInBuildMode() { return ((Character)PlayerInstance).InPlaceMode(); } private static void resetObjectTransform() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) notifyUser("Object has been reset to initial position & rotation.", (MessageType)1); ((Component)HitPiece).transform.position = InitialPosition; ((Component)HitPiece).transform.rotation = InitialRotation; } private static void resetObjectInfo() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) HitPoint = Vector3.zero; HitNormal = Vector3.zero; HitObject = null; HitPiece = null; HitHeightmap = null; InitialRotation = default(Quaternion); InitialPosition = default(Vector3); } private static void startMode() { notifyUser("Entering AEM", (MessageType)1); isActive = true; } private static void exitMode() { notifyUser("Exiting AEM", (MessageType)1); forceExitNextIteration = true; } private static void notifyUser(string Message, MessageType position = 1) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) MessageHud.instance.ShowMessage(position, "AEM: " + Message, 0, (Sprite)null, false); } private static void isRunning() { if (isActive) { MessageHud.instance.ShowMessage((MessageType)2, "AEM is active", 0, (Sprite)null, false); } } private static bool isContainer() { Container component = ((Component)HitPiece).GetComponent<Container>(); return (Object)(object)component != (Object)null; } private static void dropContainerContents() { Container component = ((Component)HitPiece).GetComponent<Container>(); component.DropAllItems(); } private static void changeModificationSpeed() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) float num = 1f; if (shiftFlag) { num = 10f; } if (Input.GetKeyDown(Configuration.Current.AdvancedEditingMode.increaseScrollSpeed)) { currentModificationSpeed = Mathf.Clamp(currentModificationSpeed + num, 1f, 30f); notifyUser("Modification Speed: " + currentModificationSpeed, (MessageType)1); } if (Input.GetKeyDown(Configuration.Current.AdvancedEditingMode.decreaseScrollSpeed)) { currentModificationSpeed = Mathf.Clamp(currentModificationSpeed - num, 1f, 30f); notifyUser("Modification Speed: " + currentModificationSpeed, (MessageType)1); } } } [HarmonyPatch(typeof(Player), "UpdatePlacementGhost")] public static class Player_UpdatePlacementGhost_Transpile { private static readonly MethodInfo Method_Quaternion_Euler = AccessTools.Method(typeof(Quaternion), "Euler", new Type[3] { typeof(float), typeof(float), typeof(float) }, (Type[])null); private static readonly MethodInfo Method_GetRotation = AccessTools.Method(typeof(Player_UpdatePlacementGhost_Transpile), "GetRotation", (Type[])null, (Type[])null); [UsedImplicitly] [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown if (!Configuration.Current.FreePlacementRotation.IsEnabled) { return instructions; } List<CodeInstruction> list = instructions.ToList(); for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], Method_Quaternion_Euler) && list[i + 1].opcode == OpCodes.Stloc_S) { object operand = list[i + 1].operand; list.InsertRange(i + 2, (IEnumerable<CodeInstruction>)(object)new CodeInstruction[4] { new CodeInstruction(OpCodes.Ldarg_0, (object)null), new CodeInstruction(OpCodes.Ldloc_S, operand), new CodeInstruction(OpCodes.Call, (object)Method_GetRotation), new CodeInstruction(OpCodes.Stloc_S, operand) }); return list.AsEnumerable(); } } ValheimPlusPlugin.Logger.LogError((object)"Couldn't transpile `Player.UpdatePlacementGhost`!"); return list.AsEnumerable(); } public static Quaternion GetRotation(Player __instance, Quaternion quaternion) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) if (ABM.isActive) { return quaternion; } FreePlacementRotation.PlayerData value; Vector3 val = (FreePlacementRotation.PlayersData.TryGetValue(__instance, out value) ? value.PlaceRotation : ((float)__instance.m_placeRotation * 22.5f * Vector3.up)); return Quaternion.Euler(val); } } public static class FreePlacementRotation { public class PlayerData { public Vector3 PlaceRotation = Vector3.zero; public bool Opposite; public Piece LastPiece; public KeyCode LastKeyCode; } [HarmonyPatch(typeof(Player), "UpdatePlacement")] public static class ModifyPUpdatePlacement { [UsedImplicitly] private static void Postfix(Player __instance, bool takeInput, float dt) { //IL_007c: 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) FreePlacementRotationConfiguration freePlacementRotation = Configuration.Current.FreePlacementRotation; if (freePlacementRotation.IsEnabled && !ABM.isActive && ((Character)__instance).InPlaceMode() && takeInput && !Hud.IsPieceSelectionVisible()) { if (!PlayersData.ContainsKey(__instance)) { PlayersData[__instance] = new PlayerData(); } RotateWithWheel(__instance); SyncRotationWithTargetInFront(__instance, freePlacementRotation.copyRotationParallel, perpendicular: false); SyncRotationWithTargetInFront(__instance, freePlacementRotation.copyRotationPerpendicular, perpendicular: true); } } private static void RotateWithWheel(Player __instance) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) float axis = Input.GetAxis("Mouse ScrollWheel"); PlayerData playerData = PlayersData[__instance]; if (!axis.Equals(0f) || ZInput.GetButton("JoyRotate")) { if (Input.GetKey(Configuration.Current.FreePlacementRotation.rotateY)) { playerData.PlaceRotation += Vector3.up * Mathf.Sign(axis); __instance.m_placeRotation = (int)(playerData.PlaceRotation.y / 22.5f); } else if (Input.GetKey(Configuration.Current.FreePlacementRotation.rotateX)) { playerData.PlaceRotation += Vector3.right * Mathf.Sign(axis); } else if (Input.GetKey(Configuration.Current.FreePlacementRotation.rotateZ)) { playerData.PlaceRotation += Vector3.forward * Mathf.Sign(axis); } else { __instance.m_placeRotation = ClampPlaceRotation(__instance.m_placeRotation); playerData.PlaceRotation = new Vector3(0f, (float)__instance.m_placeRotation * 22.5f, 0f); } playerData.PlaceRotation = ClampAngles(playerData.PlaceRotation); ManualLogSource logger = ValheimPlusPlugin.Logger; Vector3 placeRotation = playerData.PlaceRotation; logger.LogInfo((object)("Angle " + ((object)(Vector3)(ref placeRotation)).ToString())); } } private static void SyncRotationWithTargetInFront(Player __instance, KeyCode keyCode, bool perpendicular) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: 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) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); Vector3 placeRotation = default(Vector3); Piece val2 = default(Piece); Heightmap val3 = default(Heightmap); Collider val4 = default(Collider); if (!((Object)(object)__instance.m_placementGhost == (Object)null) && Input.GetKeyUp(keyCode) && __instance.PieceRayTest(ref val, ref placeRotation, ref val2, ref val3, ref val4, false) && !((Object)(object)val2 == (Object)null)) { PlayerData playerData = PlayersData[__instance]; Quaternion val5 = ((Component)val2).transform.rotation; if (perpendicular) { val5 *= Quaternion.Euler(0f, 90f, 0f); } if (playerData.LastKeyCode != keyCode || (Object)(object)playerData.LastPiece != (Object)(object)val2) { playerData.Opposite = false; } playerData.LastKeyCode = keyCode; playerData.LastPiece = val2; if (playerData.Opposite) { val5 *= Quaternion.Euler(0f, 180f, 0f); } playerData.Opposite = !playerData.Opposite; playerData.PlaceRotation = ((Quaternion)(ref val5)).eulerAngles; ManualLogSource logger = ValheimPlusPlugin.Logger; placeRotation = playerData.PlaceRotation; logger.LogInfo((object)("Sync Angle " + ((object)(Vector3)(ref placeRotation)).ToString())); } } } public static readonly Dictionary<Player, PlayerData> PlayersData = new Dictionary<Player, PlayerData>(); private const int MaxIndex = 16; private static Vector3 ClampAngles(Vector3 angles) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) return new Vector3(ClampAngle(angles.x), ClampAngle(angles.y), ClampAngle(angles.z)); } private static int ClampPlaceRotation(int index) { if (1 == 0) { } int result = ((index < 0) ? (16 + index) : ((index < 16) ? index : (index - 16))); if (1 == 0) { } return result; } private static float ClampAngle(float angle) { if (1 == 0) { } float result = ((angle < 0f) ? (360f + angle) : ((!(angle >= 360f)) ? angle : (angle - 360f))); if (1 == 0) { } return result; } } [HarmonyPatch(typeof(CharacterDrop), "GenerateDropList")] public static class CharacterDrop_GenerateDropList_Patch { private static void Prefix(ref List<Drop> ___m_drops, ref List<Drop> __state) { if (Configuration.Current.LootDrop.IsEnabled) { __state = ___m_drops; ItemDrop val = default(ItemDrop); ___m_drops = ___m_drops.ConvertAll((Drop originalDrop) => (Drop)((!originalDrop.m_prefab.TryGetComponent<ItemDrop>(ref val)) ? ((object)originalDrop) : ((object)new Drop { m_prefab = originalDrop.m_prefab, m_amountMin = (int)Helper.applyModifierValue(originalDrop.m_amountMin, Configuration.Current.LootDrop.lootDropAmountMultiplier), m_amountMax = (int)Helper.applyModifierValue(originalDrop.m_amountMax, Configuration.Current.LootDrop.lootDropAmountMultiplier), m_chance = Helper.applyModifierValue(originalDrop.m_chance, Configuration.Current.LootDrop.lootDropChanceMultiplier), m_onePerPlayer = originalDrop.m_onePerPlayer, m_levelMultiplier = originalDrop.m_levelMultiplier }))); } } private static void Postfix(ref List<Drop> ___m_drops, List<Drop> __state) { if (Configuration.Current.LootDrop.IsEnabled) { ___m_drops = __state; } } } [HarmonyPatch(typeof(Piece), "DropResources")] public static class Piece_DropResources_Transpiler { private static MethodInfo method_Piece_IsPlacedByPlayer = AccessTools.Method(typeof(Piece), "IsPlacedByPlayer", (Type[])null, (Type[])null); private static FieldInfo field_Requirement_m_recover = AccessTools.Field(typeof(Requirement), "m_recover"); [HarmonyTranspiler] public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown if (!Configuration.Current.Building.IsEnabled) { return instructions; } List<CodeInstruction> list = instructions.ToList(); if (Configuration.Current.Building.alwaysDropResources) { for (int i = 0; i < list.Count; i++) { if (CodeInstructionExtensions.Calls(list[i], method_Piece_IsPlacedByPlayer)) { list[i] = new CodeInstruction(OpCodes.Ldc_I4_1, (object)null); list.RemoveAt(i - 1); } } } if (Configuration.Current.Building.alwaysDropExcludedResources) { for (int j = 0; j < list.Count; j++) { if (CodeInstructionExtensions.LoadsField(list[j], field_Requirement_m_recover, false)) { list.RemoveRange(j - 1, 3); } } } return list.AsEnumerable(); } } [HarmonyPatch(typeof(StationExtension), "Awake")] public static class StationExtension_Awake_Patch { [HarmonyPrefix] public static void Prefix(ref float ___m_maxStationDistance) { if (Configuration.Current.Workbench.IsEnabled) { ___m_maxStationDistance = Configuration.Current.Workbench.workbenchAttachmentRange; } } } internal static class InventoryAssistant { public static List<Container> GetNearbyChests(GameObject target, float range, bool checkWard = true) { //IL_0070: 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) string[] array = new string[1] { "piece" }; if (Configuration.Current.CraftFromChest.allowCraftingFromCarts || Configuration.Current.CraftFromChest.allowCraftingFromShips) { array = new string[3] { "piece", "item", "vehicle" }; } Collider[] source = Physics.OverlapSphere(target.transform.position, range, LayerMask.GetMask(array)); IOrderedEnumerable<Collider> orderedEnumerable = source.OrderBy((Collider x) => Vector3.Distance(((Component)x).gameObject.transform.position, target.transform.position)); List<Container> list = new List<Container>(); foreach (Collider item in orderedEnumerable) { try { Container componentInParent = ((Component)item).GetComponentInParent<Container>(); if (Object.op_Implicit((Object)(object)componentInParent) && !list.Contains(componentInParent)) { bool flag = componentInParent.CheckAccess(Player.m_localPlayer.GetPlayerID()); if (checkWard) { flag = flag && PrivateArea.CheckAccess(((Component)item).gameObject.transform.position, 0f, false, true); } Piece componentInParent2 = ((Component)componentInParent).GetComponentInParent<Piece>(); bool flag2 = (Object)(object)((Component)componentInParent).GetComponentInParent<Vagon>() != (Object)null; bool flag3 = (Object)(object)((Component)componentInParent).GetComponentInParent<Ship>() != (Object)null; if ((Object)(object)componentInParent2 != (Object)null && flag && componentInParent.GetInventory() != null && (!flag2 || Configuration.Current.CraftFromChest.allowCraftingFromCarts) && (!flag3 || Configuration.Current.CraftFromChest.allowCraftingFromShips) && (componentInParent2.IsPlacedByPlayer() || (flag3 && Configuration.Current.CraftFromChest.allowCraftingFromShips))) { list.Add(componentInParent); } } } catch { } } return list; } public static List<Container> GetNearbyChestsWithItem(GameObject target, float range, ItemData itemInfo, bool checkWard = true) { List<Container> nearbyChests = GetNearbyChests(target, range, checkWard); List<Container> list = new List<Container>(); foreach (Container item in nearbyChests) { if (ChestContainsItem(item, itemInfo)) { list.Add(item); } } return list; } public static bool ChestContainsItem(Container chest, ItemData needle) { List<ItemData> allItems = chest.GetInventory().GetAllItems(); foreach (ItemData item in allItems) { if (item.m_shared.m_name == needle.m_shared.m_name) { return true; } } return false; } public static bool ChestContainsItem(Container chest, string needle) { List<ItemData> allItems = chest.GetInventory().GetAllItems(); foreach (ItemData item in allItems) { if (item.m_shared.m_name == needle) { return true; } } return false; } public static List<ItemData> GetNearbyChestItems(GameObject target, float range = 10f, bool checkWard = true) { List<ItemData> list = new List<ItemData>(); List<Container> nearbyChests = GetNearbyChests(target, range, checkWard); foreach (Container item in nearbyChests) { List<ItemData> allItems = item.GetInventory().GetAllItems(); foreach (ItemData item2 in allItems) { list.Add(item2); } } return list; } public static List<ItemData> GetNearbyChestItemsByContainerList(List<Container> nearbyChests) { List<ItemData> list = new List<ItemData>(); foreach (Container nearbyChest in nearbyChests) { List<ItemData> allItems = nearbyChest.GetInventory().GetAllItems(); foreach (ItemData item in allItems) { list.Add(item); } } return list; } public static int GetItemAmountInItemList(List<ItemData> itemList, ItemData item, int quality = -1, bool matchWorldLevel = true) { return itemList.Where((ItemData current) => current.m_shared.m_name == item.m_shared.m_name && (quality < 0 || quality == current.m_quality) && (!matchWorldLevel || current.m_worldLevel >= Game.m_worldLevel)).Sum((ItemData current) => current.m_stack); } public static int GetItemAmountInItemList(List<ItemData> itemList, string name, int quality = -1, bool matchWorldLevel = true) { return itemList.Where((ItemData current) => current.m_shared.m_name == name && (quality < 0 || quality == current.m_quality) && (!matchWorldLevel || current.m_worldLevel >= Game.m_worldLevel)).Sum((ItemData current) => current.m_stack); } public static int RemoveItemInAmountFromAllNearbyChests(GameObject target, float range, ItemData needle, int amount, bool checkWard = true) { List<Container> nearbyChests = GetNearbyChests(target, range, checkWard); List<ItemData> nearbyChestItemsByContainerList = GetNearbyChestItemsByContainerList(nearbyChests); int itemAmountInItemList = GetItemAmountInItemList(nearbyChestItemsByContainerList, needle); if (amount == 0) { return 0; } int num = 0; foreach (Container item in nearbyChests) { if (num != amount) { int num2 = RemoveItemFromChest(item, needle, amount); num += num2; amount -= num2; } } return num; } public static int RemoveItemInAmountFromAllNearbyChests(GameObject target, float range, string needle, int amount, bool checkWard = true) { List<Container> nearbyChests = GetNearbyChests(target, range, checkWard); List<ItemData> nearbyChestItemsByContainerList = GetNearbyChestItemsByContainerList(nearbyChests); int itemAmountInItemList = GetItemAmountInItemList(nearbyChestItemsByContainerList, needle); if (amount == 0) { return 0; } int num = 0; foreach (Container item in nearbyChests) { if (num != amount) { int num2 = RemoveItemFromChest(item, needle, amount); num += num2; amount -= num2; } } return num; } public static int RemoveItemFromChest(Container chest, ItemData needle, int amount = 1) { if (!ChestContainsItem(chest, needle)) { return 0; } int num = 0; List<ItemData> allItems = chest.GetInventory().GetAllItems(); foreach (ItemData item in allItems) { if (item.m_shared.m_name == needle.m_shared.m_name) { int num2 = Mathf.Min(item.m_stack, amount); item.m_stack -= num2; amount -= num2; num += num2; if (amount <= 0) { break; } } } if (num == 0) { return 0; } allItems.RemoveAll((ItemData x) => x.m_stack <= 0); chest.m_inventory.m_inventory = allItems; ConveyContainerToNetwork(chest); return num; } public static int RemoveItemFromChest(Container chest, string needle, int amount = 1) { if (!ChestContainsItem(chest, needle)) { return 0; } int num = 0; List<ItemData> allItems = chest.GetInventory().GetAllItems(); foreach (ItemData item in allItems) { if (item.m_shared.m_name == needle) { int num2 = Mathf.Min(item.m_stack, amount); item.m_stack -= num2; amount -= num2; num += num2; if (amount <= 0) { break; } } } if (num == 0) { return 0; } allItems.RemoveAll((ItemData x) => x.m_stack <= 0); chest.m_inventory.m_inventory = allItems; ConveyContainerToNetwork(chest); return num; } public static void ConveyContainerToNetwork(Container c) { c.Save(); c.GetInventory().Changed(); } } [BepInPlugin("org.bepinex.plugins.valheim_plus", "Valheim Plus", "0.9.17.1")] public class ValheimPlusPlugin : BaseUnityPlugin { private const string ValheimPlusGuid = "org.bepinex.plugins.valheim_plus"; private const string ValheimPlusName = "Valheim Plus"; public const string NumericVersion = "0.9.17.1"; private const string VersionExtra = ""; public const string FullVersion = "0.9.17.1"; private const string MinRequiredNumericVersion = "0.9.17.1"; private static readonly GameVersion MinSupportedGameVersion = new GameVersion(0, 221, 10); private static readonly GameVersion TargetGameVersion = new GameVersion(0, 221, 10); private static readonly Dictionary<GameVersion, string> ExcludeGameVersions = new Dictionary<GameVersion, string>(); public static readonly Timer MapSyncSaveTimer = new Timer(TimeSpan.FromMinutes(5.0).TotalMilliseconds); public static readonly string VPlusDataDirectoryPath; private static readonly Harmony Harmony; public const string Repository = "https://github.com/Grantapher/ValheimPlus/releases/latest"; private const string ApiRepository = "https://api.github.com/repos/grantapher/valheimPlus/releases/latest"; internal static readonly string IniFile; private static readonly object VersionCheck; internal static string newestVersion { get; private set; } = ""; internal static bool isUpToDate { get; private set; } public static ManualLogSource Logger { get; private set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)("Valheim game version: " + Version.GetVersionString(false))); Logger.LogInfo((object)"Valheim Plus full version: 0.9.17.1"); Logger.LogInfo((object)("Valheim Plus dll file location: '" + ((object)this).GetType().Assembly.Location + "'")); bool flag = IsGameVersionTooOld(); if (flag) { LogTooOld(); } bool flag2 = CheckIsGameVersionExcluded(); if (flag || flag2) { Logger.LogFatal((object)"Aborting loading of Valheim Plus due to incompatible version."); return; } Logger.LogInfo((object)"Trying to load the configuration file"); if (!ConfigurationExtra.LoadSettings()) { Logger.LogError((object)"Error while loading configuration file."); return; } Logger.LogInfo((object)"Configuration file loaded successfully."); PatchAll(); isUpToDate = !IsNewVersionAvailable(); if (!isUpToDate) { Logger.LogWarning((object)"There is a newer version available of ValheimPlus. Please visit https://github.com/Grantapher/ValheimPlus/releases/latest."); } else { Logger.LogInfo((object)"ValheimPlus [0.9.17.1] is up to date."); } if (!Directory.Exists(VPlusDataDirectoryPath)) { Directory.CreateDirectory(VPlusDataDirectoryPath); } VPlusSettings.Load(); if (ZNet.m_isServer && Configuration.Current.Map.IsEnabled && Configuration.Current.Map.shareMapProgression) { MapSyncSaveTimer.AutoReset = true; MapSyncSaveTimer.Elapsed += delegate { VPlusMapSync.SaveMapDataToDisk(); }; } Logger.LogInfo((object)"ValheimPlus done loading."); } private static bool IsGameVersionTooOld() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return Version.CurrentVersion < MinSupportedGameVersion; } private static bool IsGameVersionNewerThanTarget() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) return Version.CurrentVersion > TargetGameVersion; } private static bool CheckIsGameVersionExcluded() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) string value; bool flag = ExcludeGameVersions.TryGetValue(Version.CurrentVersion, out value); if (flag) { Logger.LogError((object)value); } return flag; } private static bool IsNewVersionAvailable() { try { string input = HttpHelper.DownloadString("https://api.github.com/repos/grantapher/valheimPlus/releases/latest"); newestVersion = new Regex("\"tag_name\":\"([^\"]*)?\"").Match(input).Groups[1].Value; } catch { Logger.LogWarning((object)"The newest version could not be determined."); newestVersion = "Unknown"; } if (Version.TryParse(newestVersion, out Version result)) { if (Version.TryParse("0.9.17.1", out Version result2)) { if (result2 < result) { return true; } } else { Logger.LogWarning((object)"Couldn't parse current version"); } } else { Logger.LogWarning((object)"Couldn't parse newest version, comparing version strings with equality."); if (newestVersion != "0.9.17.1") { return true; } } return false; } public static void PatchAll() { //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown Logger.LogInfo((object)"Applying patches."); try { Harmony.PatchAll(); if (AppDomain.CurrentDomain.GetAssemblies().Any((Assembly assembly) => assembly.FullName.Contains("assembly_steamworks"))) { Harmony.Patch((MethodBase)AccessTools.TypeByName("SteamGameServer").GetMethod("SetMaxPlayerCount"), new HarmonyMethod(typeof(ChangeSteamServerVariables).GetMethod("Prefix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } ((VersionCheck)VersionCheck).ModRequired = Configuration.Current.Server.enforceMod; Logger.LogInfo((object)"Patches successfully applied."); } catch (Exception) { Logger.LogError((object)"Failed to apply patches."); if (IsGameVersionTooOld()) { LogTooOld(); } else if (IsGameVersionNewerThanTarget()) { Logger.LogWarning((object)("This version of Valheim Plus (0.9.17.1) was compiled with a game version of " + $"\"{TargetGameVersion}\", but this game version is newer at \"{Version.CurrentVersion}\". " + "If you are using the PTB, you likely need to use the non-beta version of the game. Otherwise, the errors seen above likely will require the Valheim Plus mod to be updated. If a game update just came out for Valheim, this may take some time for the mod to be updated. See https://github.com/Grantapher/ValheimPlus/blob/grantapher-development/COMPATIBILITY.md for what game versions are compatible with what mod versions.")); } else { Logger.LogWarning((object)("Valheim Plus failed to apply patches. Please ensure the game version (" + Version.GetVersionString(false) + ") is compatible with the Valheim Plus version (0.9.17.1) at https://github.com/Grantapher/ValheimPlus/blob/grantapher-development/COMPATIBILITY.md. If it already is, please report a bug at https://github.com/Grantapher/ValheimPlus/issues.")); } throw; } } private static void LogTooOld() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) Logger.LogError((object)("This version of Valheim Plus (0.9.17.1) expects a minimum game version of " + $"\"{MinSupportedGameVersion}\", but this game version is older at \"{Version.CurrentVersion}\". " + "Please either update the Valheim game, or use an older version of Valheim Plus as per https://github.com/Grantapher/ValheimPlus/blob/grantapher-development/COMPATIBILITY.md.")); } public static void UnpatchSelf() { Logger.LogInfo((object)"Unpatching."); try { Harmony.UnpatchSelf(); Logger.LogInfo((object)"Successfully unpatched."); } catch (Exception arg) { Logger.LogError((object)$"Failed to unpatch. Exception: {arg}"); } } static ValheimPlusPlugin() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown string bepInExRootPath = Paths.BepInExRootPath; char directorySeparatorChar = Path.DirectorySeparatorChar; VPlusDataDirectoryPath = bepInExRootPath + directorySeparatorChar + "vplus-data"; Harmony = new Harmony("mod.valheim_plus"); IniFile = "https://github.com/Grantapher/ValheimPlus/releases/download/0.9.17.1/valheim_plus.cfg"; VersionCheck = new VersionCheck("org.bepinex.plugins.valheim_plus") { DisplayName = "Valheim Plus", CurrentVersion = "0.9.17.1", MinimumRequiredVersion = "0.9.17.1" }; } } internal static class Helper { private const BindingFlags FieldBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; public static Character getPlayerCharacter(Player __instance) { return (Character)(object)__instance; } public static Player getPlayerBySenderId(long id) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) List<Player> allPlayers = Player.GetAllPlayers(); foreach (Player item in allPlayers) { ZDOID zDOID = getPlayerCharacter(item).GetZDOID(); if (zDOID != new ZDOID(0L, 0u) && ((ZDOID)(ref zDOID)).UserID == id) { return item; } } return null; } public static bool IsSenderPlayerInRange(long senderId, float range) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) Player playerBySenderId = getPlayerBySenderId(senderId); float num = Vector3.Distance(((Component)playerBySenderId).transform.position, ((Component)Player.m_localPlayer).transform.position); return num <= range; } public static float tFloat(this float value, int digits) { double num = Math.Pow(10.0, digits); double num2 = Math.Truncate(num * (double)value) / num; return (float)num2; } public static float applyModifierValue(float targetValue, float value) { return (value <= -100f) ? 0f : (targetValue + targetValue / 100f * value); } public static void applyModifierValueTo(ref float targetValue, float modifier) { targetValue = ((modifier <= -100f) ? 0f : (targetValue + targetValue / 100f * modifier)); } public static int applyModifierValueWithChance(float targetValue, float value) { float num = applyModifierValue(targetValue, value); if (num == 0f) { return 0; } int num2 = (int)Math.Floor(num); return num2 + (((double)(num - (float)num2) > 1.0 - new Random().NextDouble()) ? 1 : 0); } public static string CreateMD5(string input) { using MD5 mD = MD5.Create(); byte[] bytes = Encoding.ASCII.GetBytes(input); byte[] array = mD.ComputeHash(bytes); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < array.Length; i++) { stringBuilder.Append(array[i].ToString("X2")); } return stringBuilder.ToString(); } public static void ResizeChildEffectArea(MonoBehaviour parent, Type includedTypes, float newRadius) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 if (!((Object)(object)parent != (Object)null)) { return; } EffectArea componentInChildren = ((Component)parent).GetComponentInChildren<EffectArea>(); if ((Object)(object)componentInChildren != (Object)null && (componentInChildren.m_type & includedTypes) > 0) { SphereCollider component = ((Component)componentInChildren).GetComponent<SphereCollider>(); if ((Object)(object)component != (Object)null) { component.radius = newRadius; } } } public static int Clamp(int value, int min, int max) { return Math.Min(max, Math.Max(min, value)); } public static float Clamp(float value, float min, float max) { return Math.Min(max, Math.Max(min, value)); } public static bool SetFieldIfFound(object obj, string field, object value) { FieldInfo field2 = obj.GetType().GetField(field, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field2 == null) { return false; } field2.SetValue(obj, value); return true; } } public static class VPlusDataObjects { public class MapRange { public int StartingX; public int EndingX; public int Y; } } } namespace ValheimPlus.Http { public static class HttpHelper { private const string UserAgent = "ValheimPlusClient/1.0"; public static string DownloadString(string url, TimeSpan? timeout = null) { //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Expected O, but got Unknown if (string.IsNullOrWhiteSpace(url)) { throw new ArgumentException("url is null or empty", "url"); } if (!Uri.TryCreate(url, UriKind.Absolute, out Uri result) || (result.Scheme != Uri.UriSchemeHttp && result.Scheme != Uri.UriSchemeHttps)) { throw new ArgumentException("Invalid URL scheme: '" + url + "'", "url"); } try { ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; } catch { } HttpClientHandler val = new HttpClientHandler { AllowAutoRedirect = true }; try { HttpClient val2 = new HttpClient((HttpMessageHandler)(object)val); try { val2.Timeout = timeout ?? TimeSpan.FromSeconds(20.0); val2.DefaultRequestHeaders.UserAgent.Clear(); val2.DefaultRequestHeaders.UserAgent.ParseAdd("ValheimPlusClient/1.0"); val2.DefaultRequestHeaders.Accept.Clear(); val2.DefaultRequestHeaders.Accept.ParseAdd("*/*"); HttpResponseMessage result2 = val2.GetAsync(result).GetAwaiter().GetResult(); result2.EnsureSuccessStatusCode(); return result2.Content.ReadAsStringAsync().GetAwaiter().GetResult(); } finally { ((IDisposable)val2)?.Dispose(); } } finally { ((IDisposable)val)?.Dispose(); } } } } namespace ValheimPlus.Utility { internal static class GameObjectAssistant { private static readonly ConcurrentDictionary<float, Stopwatch> Stopwatches = new ConcurrentDictionary<float, Stopwatch>(); public static Stopwatch GetStopwatch(GameObject o) { float gameObjectPositionHash = GetGameObjectPositionHash(o); if (Stopwatches.TryGetValue(gameObjectPositionHash, out var value)) { return value; } value = new Stopwatch(); Stopwatches.TryAdd(gameObjectPositionHash, value); return value; } public static float GetGameObjectPositionHash(GameObject obj) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) Vector3 position = obj.transform.position; return 1000f * position.x + position.y + 0.001f * position.z; } public static T GetChildComponentByName<T>(string name, GameObject objected) where T : Component { T[] componentsInChildren = objected.GetComponentsInChildren<T>(true); foreach (T val in componentsInChildren) { if (((Object)((Component)val).gameObject).name == name) { return val; } } return default(T); } } public static class ListExtensions { public static List<List<T>> ChunkBy<T>(this List<T> source, int chunkSize) { return (from x in source.Select((T x, int i) => new { Index = i, Value = x }) group x by x.Index / chunkSize into x select x.Select(v => v.Value).ToList()).ToList(); } } public class RpcData { public string Name; public long Target = ZRoutedRpc.Everybody; public object[] Payload; } public static class RpcQueue { private static Queue<RpcData> _rpcQueue = new Queue<RpcData>(); private static bool _ack = true; public static void Enqueue(RpcData rpc) { _rpcQueue.Enqueue(rpc); } public static bool SendNextRpc() { if (_rpcQueue.Count == 0 || !_ack) { return false; } RpcData rpcData = _rpcQueue.Dequeue(); if (Utility.IsNullOrWhiteSpace(rpcData.Name) || rpcData.Payload == null) { return false; } ZRoutedRpc.instance.InvokeRoutedRPC(rpcData.Target, rpcData.Name, rpcData.Payload); _ack = false; return true; } public static void GotAck() { _ack = true; } } public static class ZPackageExtensions { public static VPlusDataObjects.MapRange ReadVPlusMapRange(this ZPackage pkg) { return new VPlusDataObjects.MapRange { StartingX = pkg.m_reader.ReadInt32(), EndingX = pkg.m_reader.ReadInt32(), Y = pkg.m_reader.ReadInt32() }; } public static void WriteVPlusMapRange(this ZPackage pkg, VPlusDataObjects.MapRange mapRange) { pkg.m_writer.Write(mapRange.StartingX); pkg.m_writer.Write(mapRange.EndingX); pkg.m_writer.Write(mapRange.Y); } } public static class EmbeddedAsset { public static Stream LoadEmbeddedAsset(string assetPath) { Assembly executingAssembly = Assembly.GetExecutingAssembly(); string[] manifestResourceNames = executingAssembly.GetManifestResourceNames(); if (executingAssembly.GetManifestResourceInfo(executingAssembly.GetName().Name + "." + assetPath) != null) { return executingAssembly.GetManifestResourceStream(executingAssembly.GetName().Name + "." + assetPath); } return null; } } } namespace ValheimPlus.UI { [HarmonyPatch(typeof(HotkeyBar), "UpdateIcons")] public static class HotkeyBar_UpdateIcons_Patch { private const string hudObjectNamePrefix = "BowAmmoCounts"; private const string noAmmoDisplay = "No Ammo"; private static readonly GameObject[] ammoCounters = (GameObject[])(object)new GameObject[8]; private static int elementCount = -1; private static bool IsEnabled() { return Configuration.Current.Hud.IsEnabled && Configuration.Current.Hud.displayBowAmmoCounts > 0; } private static void Prefix(HotkeyBar __instance, Player player) { if (IsEnabled()) { elementCount = __instance.m_elements.Count; if ((Object)(object)player == (Object)null || ((Character)player).IsDead()) { DestroyAllAmmoCounters(); } } } private static void Postfix(HotkeyBar __instance, Player player) { if (IsEnabled()) { if (elementCount != __instance.m_elements.Count) { DestroyAllAmmoCounters(); } if (!((Object)(object)player == (Object)null) && !((Character)player).IsDead()) { DisplayAmmoCountsUnderBowHotbarIcons(__instance, player); } } } private static void DisplayAmmoCountsUnderBowHotbarIcons(HotkeyBar __instance, Player player) { HashSet<int> hashSet = new HashSet<int> { 0, 1, 2, 3, 4, 5, 6, 7 }; foreach (ItemData item in __instance.m_items) { if (item != null) { hashSet.Remove(item.m_gridPos.x); DisplayAmmoCountsUnderBowHotbarIcon(__instance, player, item); } } foreach (int item2 in hashSet) { DestroyAmmoCounter(item2); } } private static void DisplayAmmoCountsUnderBowHotbarIcon(HotkeyBar __instance, Player player, ItemData item) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Invalid comparison between Unknown and I4 //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Invalid comparison between Unknown and I4 int x = item.m_gridPos.x; GameObject val = ammoCounters[x]; if ((int)item.m_shared.m_itemType != 4 || (Configuration.Current.Hud.displayBowAmmoCounts == 1 && !((Humanoid)player).IsItemEquiped(item)) || x >= __instance.m_elements.Count || x < 0) { DestroyAmmoCounter(x); return; } ElementData val2 = __instance.m_elements[x]; TMP_Text componentInChildren; if ((Object)(object)val == (Object)null) { GameObject gameObject = ((Component)val2.m_amount).gameObject; val = Object.Instantiate<GameObject>(gameObject, gameObject.transform.parent, false); ((Object)val).name = "BowAmmoCounts" + x; val.SetActive(true); Vector3 val3 = gameObject.transform.position - ((Component)val2.m_icon).transform.position - new Vector3(0f, 15f); val.transform.Translate(val3); componentInChildren = val.GetComponentInChildren<TMP_Text>(); TMP_Text obj = componentInChildren; obj.fontSize -= 2f; ammoCounters[x] = val; } else { componentInChildren = val.GetComponentInChildren<TMP_Text>(); } val.gameObject.transform.SetParent(((Component)val2.m_amount).gameObject.transform.parent, false); ItemData ammoItem = ((Humanoid)player).m_ammoItem; if (ammoItem == null || ammoItem.m_shared.m_ammoType != item.m_shared.m_ammoType) { ammoItem = ((Humanoid)player).GetInventory().GetAmmoItem(item.m_shared.m_ammoType, (string)null); } int num = 0; int num2 = 0; List<ItemData> allItems = ((Humanoid)player).GetInventory().GetAllItems(); foreach (ItemData item2 in allItems) { if (item2.m_shared.m_ammoType == item.m_shared.m_ammoType && ((int)item2.m_shared.m_itemType == 9 || (int)item2.m_shared.m_itemType == 2)) { num2 += item2.m_stack; if (item2.m_shared.m_name == ammoItem.m_shared.m_name) { num += item2.m_stack; } } } if (num2 == 0) { componentInChildren.text = "No Ammo"; return; } componentInChildren.text = ammoItem.m_shared.m_name.Split(new char[1] { '_' }).Last() + "\n" + num + "/" + num2; } private static void DestroyAllAmmoCounters() { for (int i = 0; i < 8; i++) { DestroyAmmoCounter(i); } } private static void DestroyAmmoCounter(int index) { GameObject val = ammoCounters[index]; if ((Object)(object)val != (Object)null) { Object.Destroy((Object)(object)val); ammoCounters[index] = null; } } } public static class VPlusSettings { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Func<Font, bool> <>9__23_0; public static Func<Font, bool> <>9__25_0; public static UnityAction <>9__25_1; public static UnityAction <>9__25_2; public static Func<PropertyInfo, string> <>9__25_5; public static Func<OptionData, string> <>9__25_3; public static UnityAction<int> <>9__25_4; internal bool <Load>b__23_0(Font fnt) { return ((Object)fnt).name == "Norse"; } internal bool <Show>b__25_0(Font fnt) { return ((Object)fnt).name == "Norse"; } internal void <Show>b__25_1() { int value = dropper.value; dropper.value = 0; Apply(); Show(); dropper.value = value; } internal void <Show>b__25_2() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) Apply(); modSettingsPanel.SetActive(false); Scene activeScene = SceneManager.GetActiveScene(); SceneManager.LoadScene(((Scene)(ref activeScene)).name); } internal string <Show>b__25_5(PropertyInfo prop) { return prop.Name; } internal string <Show>b__25_3(OptionData option) { return option.text; } internal void <Show>b__25_4(int <p0>) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown foreach (Transform item in settingsContentPanel.transform) { Transform val = item; ((Component)val).gameObject.SetActive(false); } foreach (GameObject item2 in settingFamillySettings[availableSettings[dropper.value]]) { item2.SetActive(true); } } } public static bool haveAddedModMenu = false; public static GameObject modSettingsPanel = null; public static GameObject modSettingsPanelCloner = null; public static AssetBundle modSettingsBundle = null; public static GameObject enableToggle = null; public static Font norseFont; public static Color32 vplusYellow = new Color32(byte.MaxValue, (byte)164, (byte)0, byte.MaxValue); public static GameObject settingsContentPanel; public static Dictionary<string, List<GameObject>> settingFamillySettings; public static Button applyButton; public static Button okButton; public static Dropdown dropper; public static GameObject uiTooltipPrefab = null; public static string[] keycodeNames; public static List<string> availableSettings { get; private set; } public static object GetPropValue(object src, string propName) { return src.GetType().GetProperty(propName).GetValue(src, null); } public static GameObject CreateEnableToggle(string settingName, string value, Transform parent, string comments) { bool isOn = bool.Parse(value); GameObject val = Object.Instantiate<GameObject>(enableToggle); val.GetComponentInChildren<Toggle>().isOn = isOn; val.transform.SetParent(parent, false); val.SetActive(false); return val; } public static GameObject CreateTextSettingEntry(string name, string value, Transform parent, string comments) { GameObject val = Object.Instantiate<GameObject>(modSettingsBundle.LoadAsset<GameObject>("SettingEntry_Text")); ((Object)val).name = name; ((Component)val.transform.GetChild(0)).GetComponent<Text>().text = "Setting: " + name + "\nCurrent value: " + value; val.transform.SetParent(parent, false); val.SetActive(false); return val; } public static GameObject CreateKeyCodeSettingEntry(string name, string value, Transform parent, string comments) { //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Expected O, but got Unknown GameObject val = Object.Instantiate<GameObject>(modSettingsBundle.LoadAsset<GameObject>("SettingEntry_KeyCode")); ((Object)val).name = name; ((Component)val.transform.GetChild(0)).GetComponent<Text>().text = "Setting: " + name; val.transform.SetParent(parent, false); Dropdown componentInChildren = val.GetComponentInChildren<Dropdown>(); componentInChildren.options.Clear(); string[] array = keycodeNames; foreach (string text in array) { componentInChildren.options.Add(new OptionData(text)); } componentInChildren.value = keycodeNames.ToList().IndexOf(value); val.SetActive(false); return val; } public static GameObject CreateBoolSettingEntry(string name, string value, Transform parent, string comments) { //IL_007f: Unknown result type (might be due to invalid IL or missing references) GameObject val = Object.Instantiate<GameObject>(modSettingsBundle.LoadAsset<GameObject>("SettingEntry_Toggle")); ((Object)val).name = name; ((Component)val.transform.GetChild(0)).GetComponent<Text>().text = "Setting: " + name; val.GetComponentInChildren<Toggle>().isOn = bool.Parse(value); val.transform.SetParent(parent, false); ((Transform)((Component)val.GetComponentInChildren<Toggle>()).gameObject.GetComponent<RectTransform>()).localPosition = new Vector3(0f, -12.5f, 0f); val.SetActive(false); return val; } public static void Load() { norseFont = ((IEnumerable<Font>)Resources.FindObjectsOfTypeAll<Font>()).FirstOrDefault((Func<Font, bool>)((Font fnt) => ((Object)fnt).name == "Norse")); modSettingsBundle = AssetBundle.LoadFromStream(EmbeddedAsset.LoadEmbeddedAsset("Assets.Bundles.settings-ui")); modSettingsPanelCloner = modSettingsBundle.LoadAsset<GameObject>("Mod Settings"); enableToggle = modSettingsBundle.LoadAsset<GameObject>("Toggle_Enable"); uiTooltipPrefab = modSettingsBundle.LoadAsset<GameObject>("SettingsTooltip"); keycodeNames = Enum.GetNames(typeof(KeyCode)); modSettingsPanelCloner.SetActive(false); } public static void Apply() { //IL_03b3: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Unknown result type (might be due to invalid IL or missing references) if (!File.Exists(ConfigurationExtra.ConfigIniPath)) { return; } ValheimPlusPlugin.Logger.LogInfo((object)"Applying values to config file..."); FileIniDataParser fileIniDataParser = new FileIniDataParser(); IniData iniData = fileIniDataParser.ReadFile(ConfigurationExtra.ConfigIniPath); foreach (KeyValuePair<string, List<GameObject>> settingFamillySetting in settingFamillySettings) { foreach (GameObject item in settingFamillySetting.Value) { PropertyInfo property = Configuration.Current.GetType().GetProperty(settingFamillySetting.Key); object value = property.GetValue(Configuration.Current, null); Type type = value.GetType(); if (((Object)item).name.Contains("Toggle_Enable")) { Toggle componentInChildren = item.GetComponentInChildren<Toggle>(); PropertyInfo property2 = type.GetProperty("IsEnabled"); property2.SetValue(value, componentInChildren.isOn); iniData[settingFamillySetting.Key]["enabled"] = componentInChildren.isOn.ToString(); continue; } InputField componentInChildren2 = item.GetComponentInChildren<InputField>(); Toggle componentInChildren3 = item.GetComponentInChildren<Toggle>(); Dropdown componentInChildren4 = item.GetComponentInChildren<Dropdown>(); if ((Object)(object)componentInChildren2 != (Object)null) { string text = componentInChildren2.text; if (!(text == "")) { PropertyInfo property3 = type.GetProperty(((Object)item).name.Replace("(Clone)", "")); if (property3.PropertyType == typeof(float)) { iniData[settingFamillySetting.Key][((Object)item).name.Replace("(Clone)", "")] = text; } else if (property3.PropertyType == typeof(int)) { iniData[settingFamillySetting.Key][((Object)item).name.Replace("(Clone)", "")] = text; } else if (property3.PropertyType == typeof(bool)) { iniData[settingFamillySetting.Key][((Object)item).name.Replace("(Clone)", "")] = text; } else if (property3.PropertyType == typeof(KeyCode) && (!VPlusConfigSync.SyncRemote || Configuration.Current.Server.serverSyncHotkeys)) { iniData[settingFamillySetting.Key][((Object)item).name.Replace("(Clone)", "")] = text; } else { settingFamillySettings[settingFamillySetting.Key][settingFamillySettings[settingFamillySetting.Key].IndexOf(item)] = CreateTextSettingEntry(((Object)item).name.Replace("(Clone)", ""), text, item.transform.parent, string.Join("\n", iniData[settingFamillySetting.Key].GetKeyData(((Object)item).name.Replace("(Clone)", "")).Comments)); } } } else if ((Object)(object)componentInChildren4 != (Object)null) { PropertyInfo property4 = type.GetProperty(((Object)item).name.Replace("(Clone)", "")); string text2 = keycodeNames[componentInChildren4.value]; KeyCode val = (KeyCode)property4.GetValue(value, null); if (!(text2 == ((object)(KeyCode)(ref val)).ToString()) && property4.PropertyType == typeof(KeyCode) && (!VPlusConfigSync.SyncRemote || Configuration.Current.Server.serverSyncHotkeys)) { iniData[settingFamillySetting.Key][((Object)item).name.Replace("(Clone)", "")] = text2; } } else { PropertyInfo property5 = type.GetProperty(((Object)item).name.Replace("(Clone)", "")); iniData[settingFamillySetting.Key][((Object)item).name.Replace("(Clone)", "")] = componentInChildren3.isOn.ToString(); } } } fileIniDataParser.WriteFile(ConfigurationExtra.ConfigIniPath, iniData); ValheimPlusPlugin.Logger.LogInfo((object)"Values written to config file. Reloading it..."); Configuration.Current = ConfigurationExtra.LoadFromIni(ConfigurationExtra.ConfigIniPath, verbose: false); ValheimPlusPlugin.Logger.LogInfo((object)"Config reloaded. Re-patching..."); ValheimPlusPlugin.UnpatchSelf(); ValheimPlusPlugin.PatchAll(); ValheimPlusPlugin.Logger.LogInfo((object)"Re-patched. Done applying config."); } public static void Show() { //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Expected O, but got Unknown //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Expected O, but got Unknown //IL_04f4: Unknown result type (might be due to invalid IL or missing references) //IL_04fe: Expected O, but got Unknown norseFont = ((IEnumerable<Font>)Resources.FindObjectsOfTypeAll<Font>()).FirstOrDefault((Func<Font, bool>)((Font fnt) => ((Object)fnt).name == "Norse")); settingFamillySettings = new Dictionary<string, List<GameObject>>(); if ((Object)(object)modSettingsPanelCloner == (Object)null) { Load(); } if ((Object)(object)modSettingsPanel == (Object)null) { modSettingsPanel = Object.Instantiate<GameObject>(modSettingsPanelCloner); modSettingsPanel.transform.SetParent(FejdStartup.instance.m_mainMenu.transform, false); modSettingsPanel.transform.localPosition = Vector3.zero; applyButton = GameObjectAssistant.GetChildComponentByName<Button>("Apply", modSettingsPanel); dropper = modSettingsPanel.GetComponentInChildren<Dropdown>(); okButton = GameObjectAssistant.GetChildComponentByName<Button>("OK", modSettingsPanel); ButtonClickedEvent onClick = applyButton.onClick; object obj = <>c.<>9__25_1; if (obj == null) { UnityAction val = delegate { int value3 = dropper.value; dropper.value = 0; Apply(); Show(); dropper.value = value3; }; <>c.<>9__25_1 = val; obj = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj); ButtonClickedEvent onClick2 = okButton.onClick; object obj2 = <>c.<>9__25_2; if (obj2 == null) { UnityAction val2 = delegate { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) Apply(); modSettingsPanel.SetActive(false); Scene activeScene = SceneManager.GetActiveScene(); SceneManager.LoadScene(((Scene)(ref activeScene)).name); }; <>c.<>9__25_2 = val2; obj2 = (object)val2; } ((UnityEvent)onClick2).AddListener((UnityAction)obj2); ((Component)applyButton).gameObject.SetActive(false); } settingsContentPanel = ((Component)GameObjectAssistant.GetChildComponentByName<Transform>("SettingsContent", modSettingsPanel)).gameObject; ((Component)settingsContentPanel.transform.parent.parent).gameObject.GetComponentInChildren<Scrollbar>().direction = (Direction)2; dropper.options.Clear(); FileIniDataParser fileIniDataParser = new FileIniDataParser(); IniData iniData = fileIniDataParser.ReadFile(ConfigurationExtra.ConfigIniPath); foreach (PropertyInfo item2 in from prop in typeof(Configuration).GetProperties() orderby prop.Name select prop) { string name = item2.Name; if (name == "Current" || name == "Settings" || name == "Deconstruct") { continue; } settingFamillySettings.Add(name, new List<GameObject>()); object value = Configuration.Current.GetType().GetProperty(item2.Name).GetValue(Configuration.Current, null); string? value2 = value.GetType().GetProperty("IsEnabled").GetValue(value) .ToString(); Transform transform = settingsContentPanel.transform; KeyDataCollection keyDataCollection = iniData[name]; object comments; if (keyDataCollection == null) { comments = null; } else { KeyData keyData = keyDataCollection.GetKeyData("enabled"); if (keyData == null) { comments = null; } else { List<string> comments2 = keyData.Comments; comments = ((comments2 != null) ? GeneralExtensions.Join<string>((IEnumerable<string>)comments2, (Func<string, string>)null, "\n") : null); } } GameObject item = CreateEnableToggle(name, value2, transform, (string)comments); settingFamillySettings[name].Add(item); string text = ""; PropertyInfo[] properties = item2.PropertyType.GetProperties(); foreach (PropertyInfo propertyInfo in properties) { string name2 = propertyInfo.Name; if ((!(name2 == "NeedsServerSync") && !(name2 == "IsEnabled")) || 1 == 0) { KeyData keyData2 = iniData[name].GetKeyData(propertyInfo.Name); string text2 = ""; if (keyData2 != null) { List<string> comments3 = keyData2.Comments; text2 = ((comments3 != null) ? GeneralExtensions.Join<string>((IEnumerable<string>)comments3, (Func<string, string>)null, "\n") : null); text = text2; } else { text2 = text; } if (value.GetType().GetProperty(propertyInfo.Name).PropertyType == typeof(bool)) { settingFamillySettings[name].Add(CreateBoolSettingEntry(propertyInfo.Name, value.GetType().GetProperty(propertyInfo.Name).GetValue(value, null) .ToString(), settingsContentPanel.transform, text2)); } else if (value.GetType().GetProperty(propertyInfo.Name).PropertyType == typeof(KeyCode)) { settingFamillySettings[name].Add(CreateKeyCodeSettingEntry(propertyInfo.Name, value.GetType().GetProperty(propertyInfo.Name).GetValue(value, null) .ToString(), settingsContentPanel.transform, text2)); } else { settingFamillySettings[name].Add(CreateTextSettingEntry(propertyInfo.Name, value.GetType().GetProperty(propertyInfo.Name).GetValue(value, null) .ToString(), settingsContentPanel.transform, text2)); } } } dropper.options.Add(new OptionData(name)); } availableSettings = dropper.options.Select((OptionData option) => option.text).ToList(); ((UnityEvent<int>)(object)dropper.onValueChanged).AddListener((UnityAction<int>)delegate { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown foreach (Transform item3 in settingsContentPanel.transform) { Transform val3 = item3; ((Component)val3).gameObject.SetActive(false); } foreach (GameObject item4 in settingFamillySettings[availableSettings[dropper.value]]) { item4.SetActive(true); } }); dropper.value = availableSettings.IndexOf("ValheimPlus"); modSettingsPanel.SetActive(true); } } [HarmonyPatch(typeof(FejdStartup), "Update")] internal class PatchUI { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static UnityAction <>9__1_1; internal void <Postfix>b__1_1() { VPlusSettings.Show(); } } private static Transform newStart; private static void Postfix(ref GameObject ___m_mainMenu, ref GameObject ___m_settingsPrefab) { if (Input.GetKeyDown((KeyCode)291)) { if ((Object)(object)newStart == (Object)null && !VPlusSettings.haveAddedModMenu) { FindAndAddSettings(null, ___m_mainMenu.transform); } else { VPlusSettings.haveAddedModMenu = false; } } static bool FindAndAddSettings(Transform parent, Transform current) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Expected O, but got Unknown //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Expected O, but got Unknown if (((Object)current).name == "Start game" && !VPlusSettings.haveAddedModMenu) { newStart = Object.Instantiate<Transform>(current); ((Object)newStart).name = "V+ Settings"; newStart.SetParent(parent); newStart.SetSiblingIndex(3); newStart.localScale = current.localScale; TextMeshProUGUI componentInChildren = ((Component)current).GetComponentInChildren<TextMeshProUGUI>();