Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of OCDheim v0.1.5
plugins/OCDheim.dll
Decompiled 2 years ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security.Permissions; using BepInEx; using HarmonyLib; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; using UnityEngine; using UnityEngine.InputSystem; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("OCDheim")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OCDheim")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")] [assembly: AssemblyFileVersion("0.1.5.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.5.0")] namespace OCDheim; [HarmonyPatch(typeof(Player), "UpdatePlacementGhost")] public static class PreciseBuildPieceSnapper { private const float NeighbourhoodSize = 3.5f; private const float CollisionDetectionThreshold = 10f; private static readonly List<Piece> neighbourPieces = new List<Piece>(); private static readonly List<Piece> snappableNeighbourPieces = new List<Piece>(); private static bool ShouldOverrideVanillaValheim(ItemData tool) { return Keybindings.SnapModeEnabled && tool.IsHammer(); } private static bool ShouldSkipCollisionDetection(Piece buildPiece) { return buildPiece.m_groundPiece || buildPiece.m_clipGround || buildPiece.m_clipEverything; } private static bool ShouldSnapInternally(Piece buildPiece) { return buildPiece.IsConstructionPiece() && Keybindings.PrecisionModeEnabled; } private static bool ShouldSnapExternally(Piece buildPiece) { return buildPiece.IsFurniturePiece(); } public static void Postfix(bool flashGuardStone, Player __instance, GameObject ___m_placementGhost, int ___m_placeRayMask) { if ((Object)(object)___m_placementGhost != (Object)null && ___m_placementGhost.activeSelf) { ItemData rightItem = ((Humanoid)__instance).GetRightItem(); Piece component = ___m_placementGhost.GetComponent<Piece>(); int layerMask = ___m_placeRayMask - LayerMask.GetMask(new string[1] { "piece_nonsolid" }); Keybindings.Refresh(); if (Keybindings.GridModeEnabled) { PreciseGridModeSnapper.SnapToGroundGrid(rightItem, component, layerMask); } else if (ShouldOverrideVanillaValheim(rightItem)) { SnapToNeighbourPiece(component, layerMask); } } } private static void SnapToNeighbourPiece(Piece buildPiece, int layerMask) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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_003d: 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_008b: 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_00b7: 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_00a5: Unknown result type (might be due to invalid IL or missing references) Vector3 val = DeterminePlayerPoV(layerMask); List<Piece> pieces = FindNeighbourPieces(val); if (ShouldSnapInternally(buildPiece)) { SnapInternally(buildPiece, pieces); } else { if (!ShouldSnapExternally(buildPiece)) { return; } SnapTree.TraversalResult? traversalResult = (Keybindings.PrecisionModeEnabled ? SnapTree.FindNearestSuperiorPrecisionSnapNodeTo(val, pieces) : SnapTree.FindNearestOrdinaryPrecisionSnapNodeTo(val, pieces)); if (traversalResult.HasValue) { var (val2, perpendicularToPlayerPoV) = DetermineNeighbourPieceExit(traversalResult.Value.neighbourSnapNode, traversalResult.Value.neighbourPiece, layerMask); if (!ShouldSkipCollisionDetection(buildPiece)) { SnapExternally(buildPiece, val2, perpendicularToPlayerPoV); } else { ((Component)buildPiece).transform.position = val2; } } } } public static void SnapInternally(Piece buildPiece, List<Piece> neighbourPieces) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) SnapTree.TraversalResult? traversalResult = SnapTree.FindNearestOrdinaryPrecisionSnapNodeCombinationOf(buildPiece, neighbourPieces); if (traversalResult.HasValue) { Transform transform = ((Component)buildPiece).transform; transform.position += (Vector3)traversalResult.Value.neighbourSnapNode - traversalResult.Value.buildPieceSnapNode; } } public static void SnapExternally(Piece buildPiece, Vector3 neighbourPieceExit, Vector3 perpendicularToPlayerPoV) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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_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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) ((Component)buildPiece).transform.position = neighbourPieceExit + perpendicularToPlayerPoV * 10f; Vector3 buildPieceExit = DeterminePieceExit(buildPiece, neighbourPieceExit); SnapPiecesByExits(buildPiece, buildPieceExit, neighbourPieceExit, perpendicularToPlayerPoV); } private static (Vector3, Vector3) DetermineNeighbourPieceExit(SnapNode neighbourSnapNode, Piece neighbourPiece, int layerMask) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //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_000e: 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_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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) Vector3 snapNode = PokeToMiddle(neighbourSnapNode, neighbourPiece); Vector3 val = DeterminePerpendicularToPlayerPoVOn(snapNode, layerMask); Vector3 observer = (Vector3)neighbourSnapNode + val; Vector3 item = DeterminePieceExit(neighbourPiece, observer); return (item, val); } private static Vector3 DeterminePlayerPoV(int layerMask) { //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_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) Vector3 position = ((Component)GameCamera.instance).transform.position; Vector3 forward = ((Component)GameCamera.instance).transform.forward; RaycastHit val = default(RaycastHit); Physics.Raycast(position, forward, ref val, 10f, layerMask); return ((RaycastHit)(ref val)).point; } private static Vector3 DeterminePerpendicularToPlayerPoVOn(Vector3 snapNode, int layerMask) { //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_0011: 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_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) //IL_0019: 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_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) Vector3 position = ((Component)GameCamera.instance).transform.position; Vector3 val = snapNode - position; RaycastHit val2 = default(RaycastHit); Physics.Raycast(position, val, ref val2, 10f, layerMask); return ((RaycastHit)(ref val2)).normal; } private static void GetAllPiecesInRadius(Vector3 p, float radius, List<Piece> pieces) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) foreach (Piece s_allPiece in Piece.s_allPieces) { if (((Component)s_allPiece).gameObject.layer != Piece.s_ghostLayer && (double)Vector3.Distance(p, ((Component)s_allPiece).transform.position) < (double)radius) { pieces.Add(s_allPiece); } } } private static List<Piece> FindNeighbourPieces(Vector3 playerPoV) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) neighbourPieces.Clear(); snappableNeighbourPieces.Clear(); GetAllPiecesInRadius(playerPoV, 3.5f, neighbourPieces); foreach (Piece neighbourPiece in neighbourPieces) { if (neighbourPiece.IsSnappablePiece()) { snappableNeighbourPieces.Add(neighbourPiece); } } return snappableNeighbourPieces; } private static Vector3 DeterminePieceExit(Piece piece, Vector3 observer) { //IL_000d: 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_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) float num = float.PositiveInfinity; Vector3 result = ((Component)piece).transform.position; Collider[] componentsInChildren = ((Component)piece).GetComponentsInChildren<Collider>(); Collider[] array = componentsInChildren; foreach (Collider val in array) { if (!val.enabled || val.isTrigger) { continue; } MeshCollider val2 = (MeshCollider)(object)((val is MeshCollider) ? val : null); if ((Object)(object)val2 == (Object)null || val2.convex) { Vector3 val3 = val.ClosestPoint(observer); float num2 = Vector3.Distance(observer, val3); if (num2 < num) { result = val3; num = num2; } } } return result; } private static Vector3 PokeToMiddle(Vector3 snapNode, Piece piece) { //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_000d: 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_0015: 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_0024: 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_0027: 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_002f: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ((Component)piece).transform.position - snapNode; Vector3 val2 = ((Vector3)(ref val)).normalized * 0.05f; return snapNode + val2; } private static void SnapPiecesByExits(Piece buildPiece, Vector3 buildPieceExit, Vector3 neighbourPieceEntry, Vector3 perpendicularToNeighbourPiece) { //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_000d: 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_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ((Component)buildPiece).transform.position - buildPieceExit; ((Vector3)(ref val))..ctor(Mathf.Abs(val.x), Mathf.Abs(val.y), Mathf.Abs(val.z)); val = Vector3.Scale(val, perpendicularToNeighbourPiece); ((Component)buildPiece).transform.position = neighbourPieceEntry + val; } } public static class PreciseGridModeSnapper { private const string LevelGroundToolName = "mud_road_v2"; private const float MaxDrill = 5f; private static bool ShouldUsePlayerPositionAsGroundLevelReference(Piece piece) { return ((Object)piece).name == "mud_road_v2" && Keybindings.SnapModeEnabled; } private static bool ShouldUseDoublePrecision(ItemData tool) { return Keybindings.PrecisionModeEnabled && !tool.IsHoe(); } public static void SnapToGroundGrid(ItemData tool, Piece piece, int layerMask) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_005e: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) int num = ((!ShouldUseDoublePrecision(tool)) ? 1 : 2); float num2 = Mathf.Round(((Component)piece).transform.position.x * (float)num) / (float)num; float num3 = Mathf.Round(((Component)piece).transform.position.z * (float)num) / (float)num; if (ShouldUsePlayerPositionAsGroundLevelReference(piece)) { ((Component)piece).transform.position = new Vector3(num2, ((Component)piece).transform.position.y, num3); } else { Vector3? val = DeterminePreciseGroundPosition(piece, num2, num3, layerMask); if (val.HasValue) { PreciseBuildPieceSnapper.SnapExternally(piece, val.Value, Vector3.up); } else { ((Component)piece).gameObject.SetActive(false); } } if (tool.IsTerrainModificationTool()) { FixVanillaValheimBugWithSpinningTerrainModificationVFX(piece); } } private static Vector3? DeterminePreciseGroundPosition(Piece piece, float xOnGrid, float zOnGrid, int layerMask) { //IL_000a: 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_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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(xOnGrid, ((Component)piece).transform.position.y, zOnGrid); Vector3 drillFrom = val + new Vector3(0f, 2.5f, 0f); return RecursiveDrillDown(val, drillFrom, 5f, layerMask); } private static Vector3? RecursiveDrillDown(Vector3 referencePosition, Vector3 drillFrom, float drillTill, int layerMask) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) RaycastHit val = default(RaycastHit); if (Physics.Raycast(drillFrom, Vector3.down, ref val, drillTill, layerMask)) { Vector3 point = ((RaycastHit)(ref val)).point; float num = drillTill - Vector3.Distance(drillFrom, point); if (drillTill - num > 0.001f) { Vector3? result = RecursiveDrillDown(referencePosition, point, num, layerMask); if (result.HasValue) { if (Vector3.Distance(referencePosition, point) > Vector3.Distance(referencePosition, result.Value)) { return result; } return point; } return point; } return null; } return null; } private static void FixVanillaValheimBugWithSpinningTerrainModificationVFX(Piece piece) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) ((Component)piece).transform.rotation = Quaternion.Euler(0f, 0f, 0f); } } public struct Box : ISide { public char name { get; private set; } public Vector3 minMinSnapNode { get; private set; } public Vector3 minMaxSnapNode { get; private set; } public Vector3 maxMinSnapNode { get; private set; } public Vector3 maxMaxSnapNode { get; private set; } private SnapNode.Type primarySnapNodeType { get; set; } public Box(char name, Vector3 minMinSnapNode, Vector3 minMaxSnapNode, Vector3 maxMinSnapNode, Vector3 maxMaxSnapNode) { //IL_000a: 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_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) this.name = name; this.minMinSnapNode = minMinSnapNode; this.minMaxSnapNode = minMaxSnapNode; this.maxMinSnapNode = maxMinSnapNode; this.maxMaxSnapNode = maxMaxSnapNode; primarySnapNodeType = SnapNode.Type.PRIMARY; } public Box(Piece piece, Vector2 shift, char name = 'A') { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005e: 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_006e: 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_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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: 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_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) this.name = name; Vector3 val = piece.TopMiddlee(); minMinSnapNode = val + ((Component)piece).transform.rotation * new Vector3(0f - shift.x, 0f, 0f - shift.y); minMaxSnapNode = val + ((Component)piece).transform.rotation * new Vector3(0f - shift.x, 0f, shift.y); maxMinSnapNode = val + ((Component)piece).transform.rotation * new Vector3(shift.x, 0f, 0f - shift.y); maxMaxSnapNode = val + ((Component)piece).transform.rotation * new Vector3(shift.x, 0f, shift.y); primarySnapNodeType = SnapNode.Type.IMPOSED; } public void FillUp(HashSet<SnapNode> snapNodes) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //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_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_0024: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003b: 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) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: 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) //IL_00f9: 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_013b: Unknown result type (might be due to invalid IL or missing references) Vector3 dimensionΔ = minMaxSnapNode - minMinSnapNode; Vector3 dimensionΔ2 = maxMinSnapNode - minMinSnapNode; (Vector3, int) tuple = RecursiveSplit(dimensionΔ); Vector3 item = tuple.Item1; int item2 = tuple.Item2; (Vector3, int) tuple2 = RecursiveSplit(dimensionΔ2); Vector3 item3 = tuple2.Item1; int item4 = tuple2.Item2; double num = Math.Pow(2.0, item2) + 1.0; double num2 = Math.Pow(2.0, item4) + 1.0; for (int i = 0; (double)i < num; i++) { for (int j = 0; (double)j < num2; j++) { Vector3 position = minMinSnapNode + item * (float)i + item3 * (float)j; if ((i == 0 || (double)i == num - 1.0) && (j == 0 || (double)j == num2 - 1.0)) { snapNodes.Add(new SnapNode(position, primarySnapNodeType, SnapNode.Precision.ORDINARY)); } else if ((float)i % 2f == 0f && (float)j % 2f == 0f) { snapNodes.Add(new SnapNode(position, SnapNode.Type.DERIVED, SnapNode.Precision.ORDINARY)); } else { snapNodes.Add(new SnapNode(position, SnapNode.Type.DERIVED, SnapNode.Precision.SUPERIOR)); } } } } private (Vector3, int) RecursiveSplit(Vector3 dimensionΔ, int splitLevel = 0) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (((Vector3)(ref dimensionΔ)).magnitude > 0.75f) { return RecursiveSplit(dimensionΔ * 0.5f, ++splitLevel); } return (dimensionΔ, splitLevel); } public override string ToString() { //IL_001c: 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_0038: 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) return $"Box {name}: ({minMinSnapNode}, {minMaxSnapNode}, {maxMinSnapNode}, {maxMaxSnapNode})"; } } public static class GroundLevelSpinner { public const float MaxSpinner = 1f; public const float MinSpinner = 0f; public static float value { get; private set; } = 1f; public static void Refresh() { float num = Keybindings.ScrollΔ(); if (num > 0f) { up(num); } if (num < 0f) { down(num); } } private static void up(float scrollΔ) { if (value + scrollΔ > 1f) { value = 1f; } else { value = Mathf.Round((value + scrollΔ) * 100f) / 100f; } } private static void down(float scrollΔ) { if (value + scrollΔ < 0f) { value = 0f; } else { value = Mathf.Round((value + scrollΔ) * 100f) / 100f; } } } public static class ToolHelper { private const string HoeToolName = "$item_hoe"; private const string HammerToolName = "$item_hammer"; private const string CultivatorToolName = "$item_cultivator"; public static bool IsHoe(this ItemData tool) { return tool.m_shared.m_name == "$item_hoe"; } public static bool IsHammer(this ItemData tool) { return tool.m_shared.m_name == "$item_hammer"; } public static bool IsCultivator(this ItemData tool) { return tool.m_shared.m_name == "$item_cultivator"; } public static bool IsTerrainModificationTool(this ItemData tool) { return tool.IsHoe() || tool.IsCultivator(); } } public class HoverInfo { private GameObject go { get; } private Transform transform { get; } private TextMesh textMesh { get; } public string text { get { return textMesh.text; } set { textMesh.text = value; } } public bool enabled { get { return go.activeSelf; } set { go.SetActive(value); } } public Color color { get { //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_000f: Unknown result type (might be due to invalid IL or missing references) return textMesh.color; } set { //IL_0007: Unknown result type (might be due to invalid IL or missing references) textMesh.color = value; } } public HoverInfo(Transform parentTransform) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007f: 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_009b: Unknown result type (might be due to invalid IL or missing references) go = new GameObject(); go.transform.parent = parentTransform; transform = go.transform; textMesh = go.AddComponent<TextMesh>(); ((Component)textMesh).transform.localPosition = Vector3.zero; ((Component)textMesh).transform.localScale = new Vector3(0.1f / parentTransform.localScale.x, 0.1f / parentTransform.localScale.y, 0.1f / parentTransform.localScale.z); textMesh.anchor = (TextAnchor)4; textMesh.alignment = (TextAlignment)1; textMesh.fontSize = 16; } public void RotateToPlayer() { //IL_000d: 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) //IL_0031: 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_0047: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(((Component)GameCamera.m_instance).transform.position.x, transform.position.y, ((Component)GameCamera.m_instance).transform.position.z); transform.LookAt(val, Vector3.up); transform.Rotate(90f, 180f, 0f); } } [HarmonyPatch(typeof(ZInput), "Load")] public static class Keybindings { public const string GridMode = "GridMode"; public const string NoSnapMode = "AltPlace"; public const string JoyGridMode = "JoyGridMode"; public const string JoyNoSnapMode = "JoyAltPlace"; public const string PrecisionMode = "PrecisionMode"; public const string JoyPrecisionMode = "JoyPrecisionMode"; public const string MouseScrollWheel = "Mouse ScrollWheel"; public const string JoyScrollUnlock = "JoyLTrigger"; public const string JoyScrollDOwn = "JoyDPadDown"; public const string JoyScrollUp = "JoyDPadUp"; public const float OrdinaryScrollPrecision = 0.05f; public const float SuperiorScrollPrecisionMulltiplier = 0.2f; private static bool gridModeFreshlyEnabled; private static bool gridModeFreshlyDisabled; public static bool GridModeEnabled { get; private set; } public static bool GridModeDisabled => !GridModeEnabled; public static bool GridModFreshlyEnabled { get { bool result = gridModeFreshlyEnabled; gridModeFreshlyEnabled = false; return result; } } public static bool GridModFreshlyDisabled { get { bool result = gridModeFreshlyDisabled; gridModeFreshlyDisabled = false; return result; } } public static bool PrecisionModeEnabled { get; private set; } public static bool PrecisionModeDisabled => !PrecisionModeEnabled; public static bool SnapModeEnabled => !ZInput.GetButton("AltPlace") && !ZInput.GetButton("JoyAltPlace"); public static bool SnapModeDisabled => !SnapModeEnabled; public static void Postfix(ZInput __instance) { __instance.AddButton("PrecisionMode", (Key)40, 0f, 0f, true, false); __instance.AddButton("GridMode", (Key)53, 0f, 0f, true, false); __instance.AddButton("JoyGridMode", (GamepadInput)2, 0f, 0f, true, false); __instance.AddButton("JoyPrecisionMode", (GamepadInput)4, 0f, 0f, true, false); } public static void Refresh() { if (ZInput.GetButtonDown("GridMode") || ZInput.GetButtonDown("JoyGridMode")) { GridModeEnabled = !GridModeEnabled; gridModeFreshlyEnabled = GridModeEnabled; gridModeFreshlyDisabled = GridModeDisabled; } if (ZInput.GetButtonDown("PrecisionMode") || ZInput.GetButtonDown("JoyPrecisionMode")) { PrecisionModeEnabled = !PrecisionModeEnabled; } } public static float ScrollΔ() { float num = Input.GetAxis("Mouse ScrollWheel"); if (num != 0f) { num = ((num > 0f) ? 0.05f : (-0.05f)); } else if (ZInput.GetButton("JoyLTrigger")) { Debug.Log((object)"DUPA"); num = (ZInput.GetButtonDown("JoyDPadUp") ? 0.05f : num); num = (ZInput.GetButtonDown("JoyDPadDown") ? (-0.05f) : num); } return PrecisionModeDisabled ? num : (num * 0.2f); } } public class Overlay { private GameObject go { get; } private Particle[] particles { get; } = (Particle[])(object)new Particle[2]; public Transform transform { get; } public ParticleSystem ps { get; } public ParticleSystemRenderer psr { get; } public MainModule psm { get; } public bool enabled { get { return go.activeSelf; } set { go.SetActive(value); } } public Vector3 position { get { //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_000f: Unknown result type (might be due to invalid IL or missing references) return transform.position; } set { //IL_0007: Unknown result type (might be due to invalid IL or missing references) transform.position = value; } } public Vector3 locPosition { get { //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_000f: Unknown result type (might be due to invalid IL or missing references) return transform.localPosition; } set { //IL_0007: Unknown result type (might be due to invalid IL or missing references) transform.localPosition = value; } } public Quaternion rotation { get { //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_000f: Unknown result type (might be due to invalid IL or missing references) return transform.rotation; } set { //IL_0007: Unknown result type (might be due to invalid IL or missing references) transform.rotation = value; } } public Color color { get { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) ps.GetParticles(particles, 2); return Color32.op_Implicit(((Particle)(ref particles[1])).GetCurrentColor(ps)); } } public Color startColor { get { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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_0017: 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) MainModule val = psm; MinMaxGradient val2 = ((MainModule)(ref val)).startColor; return ((MinMaxGradient)(ref val2)).color; } set { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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) MainModule val = psm; MinMaxGradient val2 = ((MainModule)(ref val)).startColor; ((MinMaxGradient)(ref val2)).color = value; } } public float startSize { get { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) MainModule val = psm; MinMaxCurve val2 = ((MainModule)(ref val)).startSize; return ((MinMaxCurve)(ref val2)).constant; } set { //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_0010: Unknown result type (might be due to invalid IL or missing references) MainModule main = ps.main; ((MainModule)(ref main)).startSize = MinMaxCurve.op_Implicit(value); } } public float startSpeed { get { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) MainModule val = psm; MinMaxCurve val2 = ((MainModule)(ref val)).startSize; return ((MinMaxCurve)(ref val2)).constant; } set { //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_0010: Unknown result type (might be due to invalid IL or missing references) MainModule main = ps.main; ((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(value); } } public float startLifetime { get { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) MainModule val = psm; MinMaxCurve val2 = ((MainModule)(ref val)).startLifetime; return ((MinMaxCurve)(ref val2)).constant; } set { //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_0010: Unknown result type (might be due to invalid IL or missing references) MainModule main = ps.main; ((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(value); } } public bool sizeOverLifetimeEnabled { get { //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) SizeOverLifetimeModule val = ps.sizeOverLifetime; return ((SizeOverLifetimeModule)(ref val)).enabled; } set { //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) SizeOverLifetimeModule val = ps.sizeOverLifetime; ((SizeOverLifetimeModule)(ref val)).enabled = value; } } public MinMaxCurve sizeOverLifetime { get { //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_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) SizeOverLifetimeModule val = ps.sizeOverLifetime; return ((SizeOverLifetimeModule)(ref val)).size; } set { //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_000f: Unknown result type (might be due to invalid IL or missing references) SizeOverLifetimeModule val = ps.sizeOverLifetime; ((SizeOverLifetimeModule)(ref val)).size = value; } } public Overlay(Transform transform) { this.transform = transform; go = ((Component)transform).gameObject; ps = ((Component)transform).GetComponentInChildren<ParticleSystem>(); psr = ((Component)transform).GetComponentInChildren<ParticleSystemRenderer>(); } } public abstract class OverlayVisualizer : MonoBehaviour { protected Overlay primary; protected Overlay secondary; protected Overlay tetriary; protected HoverInfo hoverInfo; public static Texture2D remove => OCDheim.LoadTextureFromDisk("remove.png"); public static Texture2D cross => OCDheim.LoadTextureFromDisk("cross.png"); public static Texture2D undo => OCDheim.LoadTextureFromDisk("undo.png"); public static Texture2D redo => OCDheim.LoadTextureFromDisk("redo.png"); public static Texture2D box => OCDheim.LoadTextureFromDisk("box.png"); private void Update() { //IL_0082: Unknown result type (might be due to invalid IL or missing references) if (primary == null) { Transform val = ((Component)this).transform.Find("_GhostOnly"); Transform val2 = Object.Instantiate<Transform>(val, ((Component)this).transform); Transform transform = Object.Instantiate<Transform>(val2, ((Component)this).transform); primary = new Overlay(val); secondary = new Overlay(val2); tetriary = new Overlay(transform); hoverInfo = new HoverInfo(val2); tetriary.startColor = new Color(255f, 255f, 255f); primary.enabled = false; secondary.enabled = false; tetriary.enabled = false; Initialize(); } if (Keybindings.GridModFreshlyEnabled) { OnEnableGrid(); } if (Keybindings.GridModFreshlyDisabled) { OnDisableGrid(); } OnRefresh(); } protected abstract void Initialize(); protected abstract void OnRefresh(); protected abstract void OnEnableGrid(); protected abstract void OnDisableGrid(); protected void SpeedUp(Overlay ov) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) AnimationCurve val = new AnimationCurve(); val.AddKey(0f, 0f); val.AddKey(0.5f, 1f); MinMaxCurve sizeOverLifetime = default(MinMaxCurve); ((MinMaxCurve)(ref sizeOverLifetime))..ctor(1f, val); ov.startLifetime = 2f; ov.sizeOverLifetime = sizeOverLifetime; } protected void Freeze(Overlay ov) { ov.startSpeed = 0f; ov.sizeOverLifetimeEnabled = false; } protected void VisualizeTerraformingBounds(Overlay ov) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) ov.startSize = 3f; ((Renderer)ov.psr).material.mainTexture = (Texture)(object)box; ov.locPosition = new Vector3(0f, 0.05f, 0f); } protected void VisualizeRecoloringBounds(Overlay ov) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) ov.startSize = 4f; ((Renderer)ov.psr).material.mainTexture = (Texture)(object)box; ov.locPosition = new Vector3(0.5f, 0.05f, 0.5f); } protected void VisualizeIconInsideTerraformingBounds(Overlay ov, Texture iconTexture) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) ov.startSize = 2.5f; ((Renderer)ov.psr).material.mainTexture = iconTexture; ov.locPosition = new Vector3(0f, 0.05f, 0f); } protected void VisualizeIconInsideRecoloringBounds(Overlay ov, Texture iconTexture) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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) ov.startSize = 3f; ((Renderer)ov.psr).material.mainTexture = iconTexture; ov.position = ((Component)this).transform.position + new Vector3(0.5f, 0.05f, 0.5f); } } public abstract class HoverInfoEnabled : OverlayVisualizer { protected override void Initialize() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) hoverInfo.color = secondary.startColor; } protected override void OnRefresh() { //IL_002e: 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) //IL_0058: Unknown result type (might be due to invalid IL or missing references) if (hoverInfo.enabled) { hoverInfo.RotateToPlayer(); hoverInfo.text = $"x: {secondary.position.x:0}, y: {secondary.position.z:0}, h: {secondary.position.y - 0.05f:0.00000}"; } } protected override void OnEnableGrid() { } protected override void OnDisableGrid() { } } public abstract class SecondaryEnabledOnGridModePrimaryDisabledOnGridMode : HoverInfoEnabled { protected override void OnRefresh() { base.OnRefresh(); primary.enabled = Keybindings.GridModeDisabled; secondary.enabled = Keybindings.GridModeEnabled; } } public abstract class SecondaryEnabledOnGridModePrimaryEnabledAlways : HoverInfoEnabled { protected override void OnRefresh() { base.OnRefresh(); primary.enabled = true; secondary.enabled = Keybindings.GridModeEnabled; } } public abstract class SecondaryAndPrimaryEnabledAlways : OverlayVisualizer { protected override void OnRefresh() { primary.enabled = true; secondary.enabled = true; } protected override void OnEnableGrid() { } protected override void OnDisableGrid() { } } [HarmonyPatch(typeof(Piece), "SetInvalidPlacementHeightlight")] public static class OverlayVisualizationRedshiftHeighlightBlocker { private static bool Prefix(bool enabled, Piece __instance) { return (Object)(object)((Component)__instance).GetComponentInChildren<OverlayVisualizer>() == (Object)null; } } public class LevelGroundOverlayVisualizer : SecondaryEnabledOnGridModePrimaryDisabledOnGridMode { protected override void Initialize() { base.Initialize(); SpeedUp(secondary); VisualizeTerraformingBounds(secondary); } } public class RaiseGroundOverlayVisualizer : SecondaryEnabledOnGridModePrimaryEnabledAlways { protected override void Initialize() { base.Initialize(); Freeze(secondary); Freeze(tetriary); VisualizeTerraformingBounds(secondary); VisualizeTerraformingBounds(tetriary); } protected override void OnRefresh() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_008c: 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_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) base.OnRefresh(); if (Keybindings.GridModeEnabled) { GroundLevelSpinner.Refresh(); secondary.locPosition = new Vector3(0f, GroundLevelSpinner.value, 0f); if (GroundLevelSpinner.value > 0f) { hoverInfo.text = $"h: +{secondary.locPosition.y:0.00}"; } else { hoverInfo.text = $"x: {secondary.position.x:0}, y: {secondary.position.z:0}, h: {secondary.position.y:0.00000}"; } } tetriary.enabled = Keybindings.GridModeEnabled; } } public class PaveRoadOverlayVisualizer : SecondaryEnabledOnGridModePrimaryDisabledOnGridMode { protected override void Initialize() { base.Initialize(); SpeedUp(secondary); VisualizeRecoloringBounds(secondary); } } public class CultivateOverlayVisualizer : PaveRoadOverlayVisualizer { protected override void OnRefresh() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) base.OnRefresh(); hoverInfo.color = secondary.color; } } public class SeedGrassOverlayVisualizer : SecondaryEnabledOnGridModePrimaryEnabledAlways { protected override void Initialize() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) base.Initialize(); Freeze(secondary); VisualizeRecoloringBounds(secondary); primary.locPosition = new Vector3(0f, 2f, 0f); } protected override void OnRefresh() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (Keybindings.GridModeEnabled) { primary.startSize = 4f; primary.locPosition = new Vector3(0.5f, 2.5f, 0.5f); } else { primary.startSize = 5.5f; primary.locPosition = new Vector3(0f, 2.5f, 0f); } base.OnRefresh(); } protected override void OnEnableGrid() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) base.OnEnableGrid(); primary.enabled = false; primary.startSize = 4f; primary.locPosition = new Vector3(0.5f, 2.5f, 0.5f); primary.enabled = true; } protected override void OnDisableGrid() { //IL_0023: Unknown result type (might be due to invalid IL or missing references) primary.enabled = false; primary.locPosition = new Vector3(0f, 2.5f, 0f); primary.startSize = 5.5f; primary.enabled = true; base.OnDisableGrid(); } } public class RemoveModificationsOverlayVisualizer : SecondaryAndPrimaryEnabledAlways { protected override void Initialize() { Freeze(primary); SpeedUp(secondary); VisualizeTerraformingBounds(primary); VisualizeIconInsideTerraformingBounds(secondary, (Texture)(object)OverlayVisualizer.cross); } } public abstract class UndoRedoModificationsOverlayVisualizer : SecondaryAndPrimaryEnabledAlways { protected override void Initialize() { Freeze(primary); Freeze(secondary); VisualizeRecoloringBounds(primary); VisualizeIconInsideRecoloringBounds(secondary, (Texture)(object)icon()); } protected abstract Texture2D icon(); } public class UndoModificationsOverlayVisualizer : UndoRedoModificationsOverlayVisualizer { protected override Texture2D icon() { return OverlayVisualizer.undo; } } public class RedoModificationsOverlayVisualizer : UndoRedoModificationsOverlayVisualizer { protected override Texture2D icon() { return OverlayVisualizer.redo; } } public static class PieceHelpers { public static readonly Dictionary<string, Func<Piece, ISide>> SnappableFurniturePieces = new Dictionary<string, Func<Piece, ISide>> { ["$piece_table_oak"] = (Piece piece) => new Box(piece, new Vector2(3f, 0.8f)), ["$piece_blackmarble_table"] = (Piece piece) => new Box(piece, new Vector2(1.15f, 0.5f)), ["$piece_table"] = (Piece piece) => new Box(piece, new Vector2(1.1f, 0.475f)), ["$piece_table_round"] = (Piece piece) => new Circle(piece, new Vector2(1.15f, 0f)) }; private static readonly List<Transform> primarySPs = new List<Transform>(); private static readonly List<Vector3> primarySNs = new List<Vector3>(); private static Piece thisPiece = null; public static bool IsConstructionPiece(this Piece piece) { return piece.IsType((List<Vector3> snapNodes) => snapNodes.Count != 0, "CONSTRUCTION"); } public static bool IsFurniturePiece(this Piece piece) { return piece.IsType((List<Vector3> snapNodes) => snapNodes.Count == 0, "FURNITURE"); } public static bool IsSnappableFurniturePiece(this Piece piece) { return piece.IsType((List<Vector3> snapNodes) => piece.IsFurniturePiece() && SnappableFurniturePieces.ContainsKey(piece.m_name), "SNAPPABLE FURNITURE"); } public static bool IsSnappablePiece(this Piece piece) { return piece.IsConstructionPiece() || piece.IsSnappableFurniturePiece(); } public static bool IsLine(this Piece piece) { return piece.IsType((List<Vector3> snapNodes) => snapNodes.Count == 2, "LINE"); } public static bool IsBox(this Piece piece) { return piece.IsType((List<Vector3> snapNodes) => snapNodes.Count == 4 && piece.EverySnapNodeLiesOnExtremums(), "BOX"); } public static bool IsCube(this Piece piece) { return piece.IsType((List<Vector3> snapNodes) => snapNodes.Count == 8 && piece.EverySnapNodeLiesOnExtremums(), "CUBE"); } public static bool IsCylinder(this Piece piece) { return piece.IsType((List<Vector3> snapNodes) => snapNodes.Count == 18, "CYLINDER"); } public static List<Vector3> PrimarySnapNodesDefensiveCopy(this Piece piece) { return new List<Vector3>(primarySNs); } public static List<Vector3> PrimarySnapNodes(this Piece piece) { piece.FlushWhenRequired(); return primarySNs; } public static Vector3 TopMiddlee(this Piece piece) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: 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_0042: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) Collider[] componentsInChildren = ((Component)piece).GetComponentsInChildren<Collider>(); Bounds bounds = ((Component)piece).GetComponentInChildren<Collider>().bounds; Collider[] array = componentsInChildren; foreach (Collider val in array) { ((Bounds)(ref bounds)).Encapsulate(val.bounds); } float y = ((Bounds)(ref bounds)).max.y; return new Vector3(((Component)piece).transform.position.x, y, ((Component)piece).transform.position.z); } private static void FlushWhenRequired(this Piece piece) { if ((Object)(object)thisPiece != (Object)(object)piece) { thisPiece = piece; primarySPs.Clear(); primarySNs.Clear(); piece.PopulatePrimarySnapNodes(); } } private static bool IsType(this Piece piece, Func<List<Vector3>, bool> isShape, string shapeName) { piece.FlushWhenRequired(); if (isShape(primarySNs)) { return true; } return false; } private static void PopulatePrimarySnapNodes(this Piece piece) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) piece.GetSnapPoints(primarySPs); foreach (Transform primarySP in primarySPs) { primarySNs.Add(((Component)primarySP).transform.position); } } private static bool EverySnapNodeLiesOnExtremums(this Piece piece) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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_0024: 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_0028: Unknown result type (might be due to invalid IL or missing references) Vector3 minimums = piece.SolveMinimumsOf(); Vector3 maximums = piece.SolveMaximumsOf(); foreach (Vector3 primarySN in primarySNs) { if (!LiesOnExtremums(primarySN, minimums, maximums)) { return false; } } return true; } private static Vector3 SolveMinimumsOf(this Piece piece) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) float num = float.PositiveInfinity; float num2 = float.PositiveInfinity; float num3 = float.PositiveInfinity; foreach (Vector3 primarySN in primarySNs) { num = ((num > primarySN.x) ? primarySN.x : num); num2 = ((num2 > primarySN.y) ? primarySN.y : num2); num3 = ((num3 > primarySN.z) ? primarySN.z : num3); } return new Vector3(num, num2, num3); } private static Vector3 SolveMaximumsOf(this Piece piece) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) float num = float.NegativeInfinity; float num2 = float.NegativeInfinity; float num3 = float.NegativeInfinity; foreach (Vector3 primarySN in primarySNs) { num = ((num < primarySN.x) ? primarySN.x : num); num2 = ((num2 < primarySN.y) ? primarySN.y : num2); num3 = ((num3 < primarySN.z) ? primarySN.z : num3); } return new Vector3(num, num2, num3); } private static bool LiesOnExtremums(Vector3 snapNode, Vector3 minimums, Vector3 maximums) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) if (snapNode.x != minimums.x && snapNode.x != maximums.x) { return false; } if (snapNode.y != minimums.y && snapNode.y != maximums.y) { return false; } if (snapNode.z != minimums.z && snapNode.z != maximums.z) { return false; } return true; } } [HarmonyPatch(typeof(TerrainComp), "InternalDoOperation")] public static class PreciseTerrainModifier { public const int SizeInTiles = 1; private static bool Prefix(Vector3 pos, Settings modifier, Heightmap ___m_hmap, int ___m_width, ref float[] ___m_levelDelta, ref float[] ___m_smoothDelta, ref Color[] ___m_paintMask, ref bool[] ___m_modifiedHeight, ref bool[] ___m_modifiedPaint) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (!modifier.m_level && !modifier.m_raise && !modifier.m_smooth && !modifier.m_paintCleared) { RemoveTerrainModifications(pos, ___m_hmap, ___m_width, ref ___m_levelDelta, ref ___m_smoothDelta, ref ___m_modifiedHeight); RecolorTerrain(pos, (PaintType)3, ___m_hmap, ___m_width, ref ___m_paintMask, ref ___m_modifiedPaint); } return true; } public static void SmoothenTerrain(Vector3 worldPos, Heightmap hMap, TerrainComp compiler, int worldWidth, ref float[] smoothΔ, ref bool[] modifiedHeight) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"[INIT] Smooth Terrain Modification"); int num = worldWidth + 1; int num2 = default(int); int num3 = default(int); hMap.WorldToVertex(worldPos, ref num2, ref num3); float num4 = worldPos.y - ((Component)compiler).transform.position.y; Debug.Log((object)$"worldPos: {worldPos}, xPos: {num2}, yPos: {num3}, referenceH: {num4}"); FindExtremums(num2, num, out var xMin, out var xMax); FindExtremums(num3, num, out var xMin2, out var xMax2); for (int i = xMin; i <= xMax; i++) { for (int j = xMin2; j <= xMax2; j++) { int num5 = j * num + i; float height = hMap.GetHeight(i, j); float num6 = num4 - height; float num7 = smoothΔ[num5]; float num8 = num7 + num6; float num9 = RoundToTwoDecimals(height, num7, num8); float num10 = Mathf.Clamp(num9, -1f, 1f); smoothΔ[num5] = num10; modifiedHeight[num5] = true; Debug.Log((object)$"tilePos: ({i}, {j}), tileH: {height}, Δh: {num6}, oldΔh: {num7}, newΔh: {num8}, roundedNewΔh: {num9}, limΔh: {num10}"); } } Debug.Log((object)"[SUCCESS] Smooth Terrain Modification"); } public static void RaiseTerrain(Vector3 worldPos, Heightmap hMap, TerrainComp compiler, int worldWidth, float power, ref float[] levelΔ, ref float[] smoothΔ, ref bool[] modifiedHeight) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)"[INIT] Raise Terrain Modification"); int num = worldWidth + 1; int num2 = default(int); int num3 = default(int); hMap.WorldToVertex(worldPos, ref num2, ref num3); float num4 = worldPos.y - ((Component)compiler).transform.position.y + power; Debug.Log((object)$"worldPos: {worldPos}, xPos: {num2}, yPos: {num3}, power: {power}, referenceH: {num4}"); FindExtremums(num2, num, out var xMin, out var xMax); FindExtremums(num3, num, out var xMin2, out var xMax2); for (int i = xMin; i <= xMax; i++) { for (int j = xMin2; j <= xMax2; j++) { int num5 = j * num + i; float height = hMap.GetHeight(i, j); float num6 = num4 - height; if (num6 >= 0f) { float num7 = levelΔ[num5]; float num8 = smoothΔ[num5]; float num9 = num7 + num8 + num6; float num10 = 0f; float num11 = RoundToTwoDecimals(height, num7 + num8, num9 + num10); float num12 = Mathf.Clamp(num11, -16f, 16f); levelΔ[num5] = num12; smoothΔ[num5] = num10; modifiedHeight[num5] = true; Debug.Log((object)$"tilePos: ({i}, {j}), tileH: {height}, Δh: {num6}, oldLevelΔ: {num7}, oldSmoothΔ: {num8}, newLevelΔ: {num9}, newSmoothΔ: {num10}, roundedNewLevelΔ: {num11}, limitedNewLevelΔ: {num12}"); } else { Debug.Log((object)"Declined to process tile: Δh < 0!"); Debug.Log((object)$"tilePos: ({i}, {j}), tileH: {height}, Δh: {num6}"); } } } Debug.Log((object)"[SUCCESS] Raise Terrain Modification"); } public static void RecolorTerrain(Vector3 worldPos, PaintType paintType, Heightmap hMap, int worldWidth, ref Color[] paintMask, ref bool[] modifiedPaint) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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) Debug.Log((object)"[INIT] Color Terrain Modification"); worldPos -= new Vector3(0.5f, 0f, 0.5f); int num = default(int); int num2 = default(int); hMap.WorldToVertex(worldPos, ref num, ref num2); Debug.Log((object)$"worldPos: {worldPos}, vertexPos: ({num}, {num2})"); Color val = ResolveColor(paintType); bool flag = val == Color.black; FindExtremums(num, worldWidth, out var xMin, out var xMax); FindExtremums(num2, worldWidth, out var xMin2, out var xMax2); for (int i = xMin; i <= xMax; i++) { for (int j = xMin2; j <= xMax2; j++) { int num3 = j * worldWidth + i; paintMask[num3] = val; modifiedPaint[num3] = !flag; Debug.Log((object)$"tilePos: ({i}, {j}), tileIndex: {num3}, tileColor: {val}"); } } Debug.Log((object)"[SUCCESS] Color Terrain Modification"); } public static void RemoveTerrainModifications(Vector3 worldPos, Heightmap hMap, int worldWidth, ref float[] levelΔ, ref float[] smoothΔ, ref bool[] modifiedHeight) { //IL_0011: 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) Debug.Log((object)"[INIT] Remove Terrain Modifications"); int num = worldWidth + 1; int num2 = default(int); int num3 = default(int); hMap.WorldToVertex(worldPos, ref num2, ref num3); Debug.Log((object)$"worldPos: {worldPos}, vertexPos: ({num2}, {num3})"); FindExtremums(num2, num, out var xMin, out var xMax); FindExtremums(num3, num, out var xMin2, out var xMax2); for (int i = xMin; i <= xMax; i++) { for (int j = xMin2; j <= xMax2; j++) { int num4 = j * num + i; levelΔ[num4] = 0f; smoothΔ[num4] = 0f; modifiedHeight[num4] = false; Debug.Log((object)$"tilePos: ({i}, {j}), tileIndex: {num4}"); } } Debug.Log((object)"[SUCCESS] Remove Terrain Modifications"); } public static Color ResolveColor(PaintType paintType) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_0031: Unknown result type (might be due to invalid IL or missing references) if ((int)paintType == 0) { return Color.red; } if ((int)paintType == 2) { return Color.blue; } if ((int)paintType == 1) { return Color.green; } return Color.black; } public static void FindExtremums(int x, int worldSize, out int xMin, out int xMax) { xMin = Mathf.Max(0, x - 1); xMax = Mathf.Min(x + 1, worldSize - 1); } public static float RoundToTwoDecimals(float oldH, float oldΔh, float newΔh) { float num = oldH - oldΔh + newΔh; float num2 = Mathf.Round(num * 100f) / 100f; float num3 = num2 - oldH + oldΔh; Debug.Log((object)$"oldH: {oldH}, oldΔH: {oldΔh}, newΔH: {newΔh}, newH: {num}, roundedNewH: {num2}, roundedNewΔh: {num3}"); return num3; } } [HarmonyPatch(typeof(TerrainComp), "SmoothTerrain")] public static class PreciseSmoothTerrainModification { private static bool Prefix(Vector3 worldPos, float radius, bool square, float power, TerrainComp __instance, Heightmap ___m_hmap, int ___m_width, ref float[] ___m_smoothDelta, ref bool[] ___m_modifiedHeight) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (ClientSideGridModeOverride.IsGridModeEnabled(radius)) { PreciseTerrainModifier.SmoothenTerrain(worldPos, ___m_hmap, __instance, ___m_width, ref ___m_smoothDelta, ref ___m_modifiedHeight); return false; } return true; } } [HarmonyPatch(typeof(TerrainComp), "RaiseTerrain")] public static class PreciseRaiseTerrainModification { private static bool Prefix(Vector3 worldPos, float radius, float delta, bool square, float power, TerrainComp __instance, Heightmap ___m_hmap, int ___m_width, ref float[] ___m_levelDelta, ref float[] ___m_smoothDelta, ref bool[] ___m_modifiedHeight) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) if (ClientSideGridModeOverride.IsGridModeEnabled(radius)) { PreciseTerrainModifier.RaiseTerrain(worldPos, ___m_hmap, __instance, ___m_width, delta, ref ___m_levelDelta, ref ___m_smoothDelta, ref ___m_modifiedHeight); return false; } return true; } } [HarmonyPatch(typeof(TerrainComp), "PaintCleared")] public static class PreciseColorTerrainModification { private static bool Prefix(Vector3 worldPos, float radius, PaintType paintType, bool heightCheck, bool apply, Heightmap ___m_hmap, int ___m_width, ref Color[] ___m_paintMask, ref bool[] ___m_modifiedPaint) { //IL_000c: 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) if (ClientSideGridModeOverride.IsGridModeEnabled(radius)) { PreciseTerrainModifier.RecolorTerrain(worldPos, paintType, ___m_hmap, ___m_width, ref ___m_paintMask, ref ___m_modifiedPaint); return false; } return true; } } [HarmonyPatch(typeof(TerrainComp), "ApplyOperation")] public static class ClientSideGridModeOverride { private static bool Prefix(TerrainOp modifier) { if (Keybindings.GridModeEnabled) { if (modifier.m_settings.m_smooth) { modifier.m_settings.m_smoothRadius = float.NegativeInfinity; } if (modifier.m_settings.m_raise && modifier.m_settings.m_raiseDelta >= 0f) { modifier.m_settings.m_raiseRadius = float.NegativeInfinity; modifier.m_settings.m_raiseDelta = GroundLevelSpinner.value; } if (modifier.m_settings.m_paintCleared) { modifier.m_settings.m_paintRadius = float.NegativeInfinity; } } return true; } public static bool IsGridModeEnabled(float radius) { return radius == float.NegativeInfinity; } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("dymek.dev.OCDheim", "OCDheim", "0.1.5")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class OCDheim : BaseUnityPlugin { private Texture2D brick1x1 => LoadTextureFromDisk("brick_1x1.png"); private Texture2D brick2x1 => LoadTextureFromDisk("brick_2x1.png"); private Texture2D brick1x2 => LoadTextureFromDisk("brick_1x2.png"); private Texture2D brick4x2 => LoadTextureFromDisk("brick_4x2.png"); private Harmony harmony { get; } = new Harmony("dymek.OCDheim"); private static OCDheim ocdheim { get; set; } public static Texture2D LoadTextureFromDisk(string fileName) { return AssetUtils.LoadTexture(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)ocdheim).Info.Location), fileName), true); } public void Awake() { ocdheim = this; harmony.PatchAll(); PrefabManager.OnVanillaPrefabsAvailable += AddOCDheimToolPieces; PrefabManager.OnVanillaPrefabsAvailable += AddOCDheimBuildPieces; PrefabManager.OnVanillaPrefabsAvailable += ModVanillaValheimTools; } private void AddOCDheimToolPieces() { AddToolPiece<RemoveModificationsOverlayVisualizer>("Remove Terrain Modifications", "mud_road_v2", "Hoe", OverlayVisualizer.remove); } private void AddToolPiece<TOverlayVisualizer>(string pieceName, string basePieceName, string pieceTable, Texture2D iconTexture, bool level = false, bool raise = false, bool smooth = false, bool paint = false) where TOverlayVisualizer : OverlayVisualizer { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0039: 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_0048: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown if (PieceManager.Instance.GetPiece(pieceName) == null) { Sprite icon = Sprite.Create(new Texture2D(64, 64), new Rect(0f, 0f, 64f, 64f), Vector2.zero); if ((Object)(object)iconTexture == (Object)null) { Debug.LogWarning((object)"OCDHeim: Installation is missing Texture Files."); } else { icon = Sprite.Create(iconTexture, new Rect(0f, 0f, (float)((Texture)iconTexture).width, (float)((Texture)iconTexture).height), Vector2.zero); } CustomPiece val = new CustomPiece(pieceName, basePieceName, new PieceConfig { Name = pieceName, Icon = icon, PieceTable = pieceTable }); Settings settings = val.PiecePrefab.GetComponent<TerrainOp>().m_settings; settings.m_level = level; settings.m_raise = raise; settings.m_smooth = smooth; settings.m_paintCleared = paint; val.PiecePrefab.AddComponent<TOverlayVisualizer>(); PieceManager.Instance.AddPiece(val); } } private void AddOCDheimBuildPieces() { //IL_0016: 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_0064: 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) AddBrickBuildPiece("1x1", new Vector3(0.5f, 1f, 0.5f), 3, brick1x1); AddBrickBuildPiece("2x1", new Vector3(1f, 1f, 0.5f), 4, brick2x1); AddBrickBuildPiece("4x2", new Vector3(2f, 2f, 0.5f), 6, brick4x2); AddBrickBuildPiece("1x2", new Vector3(0.5f, 2f, 0.5f), 5, brick1x2); PrefabManager.OnVanillaPrefabsAvailable -= AddOCDheimBuildPieces; } private void AddBrickBuildPiece(string brickSuffix, Vector3 brickScale, int brickPrice, Texture2D iconTexture) { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Expected O, but got Unknown //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: 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_00cc: Expected O, but got Unknown //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Expected O, but got Unknown //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Expected O, but got Unknown if (PieceManager.Instance.GetPiece("stone_floor_" + brickSuffix) == null) { GameObject val = PrefabManager.Instance.CreateClonedPrefab("stone_floor_" + brickSuffix, "stone_floor_2x2"); Sprite icon = Sprite.Create(new Texture2D(64, 64), new Rect(0f, 0f, 64f, 64f), Vector2.zero); if ((Object)(object)iconTexture == (Object)null) { Debug.LogWarning((object)"OCDHeim: Installation is missing Texture Files."); } else { icon = Sprite.Create(iconTexture, new Rect(0f, 0f, (float)((Texture)iconTexture).width, (float)((Texture)iconTexture).height), Vector2.zero); } val.transform.localScale = brickScale; PieceConfig val2 = new PieceConfig(); val2.Name = "Smooth stone " + brickSuffix; val2.PieceTable = "Hammer"; val2.Category = "Building"; val2.Icon = icon; val2.AddRequirement(new RequirementConfig("Stone", brickPrice, 0, true)); PieceManager.Instance.AddPiece(new CustomPiece(val, false, val2)); } } private void ModVanillaValheimTools() { PrefabManager.Instance.GetPrefab("mud_road_v2").AddComponent<LevelGroundOverlayVisualizer>(); PrefabManager.Instance.GetPrefab("raise_v2").AddComponent<RaiseGroundOverlayVisualizer>(); PrefabManager.Instance.GetPrefab("path_v2").AddComponent<PaveRoadOverlayVisualizer>(); PrefabManager.Instance.GetPrefab("paved_road_v2").AddComponent<PaveRoadOverlayVisualizer>(); PrefabManager.Instance.GetPrefab("cultivate_v2").AddComponent<CultivateOverlayVisualizer>(); PrefabManager.Instance.GetPrefab("replant_v2").AddComponent<SeedGrassOverlayVisualizer>(); } } public class Circle : ISide { private const int CircleDivisions = 8; public char name { get; private set; } public Vector3 midSnapNode { get; private set; } public Vector2 radial { get; private set; } public Circle(Piece piece, Vector2 radial, char name = 'A') { //IL_0011: 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) this.name = name; this.radial = radial; midSnapNode = piece.TopMiddlee(); } public void FillUp(HashSet<SnapNode> snapNodes) { //IL_0018: 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) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003a: 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_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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) for (int i = 0; i < 8; i++) { Vector3 val = Quaternion.Euler(new Vector3(0f, 45f * (float)i, 0f)) * Vector2.op_Implicit(radial); Vector3 val2 = midSnapNode + val; snapNodes.Add(new SnapNode(midSnapNode, SnapNode.Type.IMPOSED, SnapNode.Precision.ORDINARY)); snapNodes.Add(new SnapNode(val2, SnapNode.Type.IMPOSED, SnapNode.Precision.ORDINARY)); SnapNode.RecursiveSplit(midSnapNode, val2, snapNodes); } } public override string ToString() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) return $"Circle {name}: {midSnapNode} + {radial} * quaternion rotation"; } } public interface ISide { void FillUp(HashSet<SnapNode> snapNodes); } public struct Line : ISide { public char name { get; private set; } public Vector3 minSnapNode { get; private set; } public Vector3 maxSnapNode { get; private set; } public void FillUp(HashSet<SnapNode> snapNodes) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) SnapNode.RecursiveSplit(minSnapNode, maxSnapNode, snapNodes); } public Line(char name, Vector3 minSnapNode, Vector3 maxSnapNode) { //IL_000a: 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) this.name = name; this.minSnapNode = minSnapNode; this.maxSnapNode = maxSnapNode; } public override string ToString() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) return $"Line {name}: ({minSnapNode}, {maxSnapNode})"; } } public struct SnapNode { public enum Type { PRIMARY, IMPOSED, DERIVED } public enum Precision { ORDINARY, SUPERIOR } public const float OrdinaryPrecisionSplitThreshold = 1.5f; public const float SuperiorPrecisionMultiplier = 2f; public Vector3 position { get; private set; } public Type type { get; private set; } public Precision precision { get; private set; } private static bool ShouldSplitInOrdinaryPrecisionMode(Vector3 prevSnapNode, Vector3 nextSnapNode) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Vector3.Distance(prevSnapNode, nextSnapNode) > 1.5f; } private static bool ShouldSplitInSuperiorPrecisionMode(Vector3 prevSnapNode, Vector3 nextSnapNode) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) return Vector3.Distance(prevSnapNode, nextSnapNode) > 0.75f; } public SnapNode(Vector3 position, Type type, Precision precision) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) this.position = position; this.type = type; this.precision = precision; } public static void RecursiveSplit(Vector3 snapNodeA, Vector3 snapNodeB, HashSet<SnapNode> snapNodes) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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_0020: Unknown result type (might be due to invalid IL or missing references) snapNodes.Add(new SnapNode(snapNodeA, Type.PRIMARY, Precision.ORDINARY)); snapNodes.Add(new SnapNode(snapNodeB, Type.PRIMARY, Precision.ORDINARY)); RecursiveSplitInOrdinaryPrecisionMode(snapNodeA, snapNodeB, snapNodes); } private static void RecursiveSplitInOrdinaryPrecisionMode(Vector3 snapNodeA, Vector3 snapNodeB, HashSet<SnapNode> snapNodes, int splitLevel = 0) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: 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_0047: 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_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (ShouldSplitInOrdinaryPrecisionMode(snapNodeA, snapNodeB)) { Vector3 val = (snapNodeA + snapNodeB) * 0.5f; snapNodes.Add(new SnapNode(val, Type.DERIVED, Precision.ORDINARY)); RecursiveSplitInOrdinaryPrecisionMode(snapNodeA, val, snapNodes, splitLevel); RecursiveSplitInOrdinaryPrecisionMode(val, snapNodeB, snapNodes, splitLevel); } else { RecursiveSplitInSuperiorPrecisionMode(snapNodeA, snapNodeB, snapNodes, splitLevel); } } private static void RecursiveSplitInSuperiorPrecisionMode(Vector3 snapNodeA, Vector3 snapNodeB, HashSet<SnapNode> snapNodes, int splitLevel) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: 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_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: 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_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if (ShouldSplitInSuperiorPrecisionMode(snapNodeA, snapNodeB)) { Vector3 val = (snapNodeA + snapNodeB) * 0.5f; snapNodes.Add(new SnapNode(val, Type.DERIVED, Precision.SUPERIOR)); RecursiveSplitInSuperiorPrecisionMode(snapNodeA, val, snapNodes, splitLevel); RecursiveSplitInSuperiorPrecisionMode(val, snapNodeB, snapNodes, splitLevel); } } public static implicit operator Vector3(SnapNode snapNode) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return snapNode.position; } public override string ToString() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) return $"{type} Snap Node of {precision} precision: {position}"; } public override bool Equals(object other) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) return other is SnapNode snapNode && snapNode.position == position; } public override int GetHashCode() { //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) Vector3 val = position; return ((object)(Vector3)(ref val)).GetHashCode(); } } public class SnapTree { public struct TraversalResult { public Vector3 buildPieceSnapNode { get; } public SnapNode neighbourSnapNode { get; } public Piece neighbourPiece { get; } public TraversalResult(Vector3 buildPieceSnapNode, SnapNode neighbourSnapNode, Piece neighbourPiece) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) this.buildPieceSnapNode = buildPieceSnapNode; this.neighbourSnapNode = neighbourSnapNode; this.neighbourPiece = neighbourPiece; } } private const int SidesOfLine = 1; private const int SidesOfBox = 1; private const int SidesOfCube = 6; private const int SidesOfOctagon = 10; private const float SnapThreshold = 1f; private static readonly List<Vector3> horribleOptimization = new List<Vector3>(1); private static readonly Dictionary<Piece, SnapTree> snapWood = new Dictionary<Piece, SnapTree>(1000); private static Func<SnapNode.Precision, bool> ordinaryPrecisionOnly = (SnapNode.Precision precision) => precision == SnapNode.Precision.ORDINARY; private static Func<SnapNode.Precision, bool> ordinaryAndSuperiorPrecision = (SnapNode.Precision precision) => precision == SnapNode.Precision.ORDINARY || precision == SnapNode.Precision.SUPERIOR; public Piece piece { get; private set; } private HashSet<SnapNode> snapNodes { get; } = new HashSet<SnapNode>(); private static bool FormValidTwoDimensionalBoxSide(Vector3 snapNodeA, Vector3 snapNodeB, Vector3 snapNodeC, Vector3 snapNodeD) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: 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_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_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) return snapNodeA != snapNodeB && snapNodeA != snapNodeC && snapNodeB + snapNodeC - snapNodeA == snapNodeD; } private static Func<Vector3, Vector3, Vector3, Vector3, bool> FormValidThreeDimensionalBoxSide(Piece piece) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) Vector3 pieceMid = ((Component)piece).transform.position; return delegate(Vector3 snapNodeA, Vector3 snapNodeB, Vector3 snapNodeC, Vector3 snapNodeD) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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_0017: 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_0026: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (snapNodeA + snapNodeD) * 0.5f; return FormValidTwoDimensionalBoxSide(snapNodeA, snapNodeB, snapNodeC, snapNodeD) && pieceMid != val; }; } private static bool LiesOnVerticalMiddle(Vector3 snapNode, Piece piece) { //IL_0000: 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) return snapNode.x == ((Component)piece).transform.position.y; } private static bool LiesOnHorizontalMiddle(Vector3 snapNode, Piece piece) { //IL_0000: 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_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) return snapNode.x == ((Component)piece).transform.position.x && snapNode.z == ((Component)piece).transform.position.z; } private static bool LiesOnSameVerticalSide(Vector3 snapNodeA, Vector3 snapNodeB) { //IL_0000: 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_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) return snapNodeA.x == snapNodeB.x && snapNodeA.y != snapNodeB.y && snapNodeA.z == snapNodeB.z; } private static bool LiesOnSameHorizontalSide(Vector3 snapNodeA, Vector3 snapNodeB) { //IL_0000: 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) return snapNodeA.y != snapNodeB.y; } private SnapTree(Piece piece) { this.piece = piece; List<ISide> list = FindSidesOf(piece); foreach (ISide item in list) { item.FillUp(snapNodes); } } private static SnapTree Of(Piece piece) { if (snapWood.ContainsKey(piece)) { return snapWood[piece]; } SnapTree snapTree = new SnapTree(piece); snapWood[piece] = snapTree; return snapTree; } public static TraversalResult? FindNearestOrdinaryPrecisionSnapNodeTo(Vector3 referencePosition, List<Piece> pieces) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return FindNearestSnapNodeTo(referencePosition, pieces, ordinaryPrecisionOnly); } public static TraversalResult? FindNearestSuperiorPrecisionSnapNodeTo(Vector3 referencePosition, List<Piece> pieces) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return FindNearestSnapNodeTo(referencePosition, pieces, ordinaryAndSuperiorPrecision); } public static TraversalResult? FindNearestOrdinaryPrecisionSnapNodeCombinationOf(Piece buildPiece, List<Piece> neighbourPieces) { return FindNearestSnapNodeTo(buildPiece.PrimarySnapNodesDefensiveCopy(), neighbourPieces, ordinaryPrecisionOnly); } public static TraversalResult? FindNearestSuperiorPrecisionSnapNodeCombinationOf(Piece buildPiece, List<Piece> neighbourPieces) { return FindNearestSnapNodeTo(buildPiece.PrimarySnapNodesDefensiveCopy(), neighbourPieces, ordinaryAndSuperiorPrecision); } private static List<ISide> FindSidesOf(Piece piece) { if (piece.IsConstructionPiece()) { if (piece.IsLine()) { return FindSideOfLine(piece); } if (piece.IsBox()) { return FindSideOfBox(piece); } if (piece.IsCube()) { return FindSidesOfCube(piece); } if (piece.IsCylinder()) { return FindSidesOfCylinder(piece); } return FindSidesOfUndefined(piece); } if (piece.IsSnappableFurniturePiece()) { return new List<ISide> { PieceHelpers.SnappableFurniturePieces[piece.m_name](piece) }; } return new List<ISide>(); } private static List<ISide> FindSideOfLine(Piece piece) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) List<ISide> list = FindSidesOfUndefined(piece); if (list.Count != 1) { Debug.LogWarning((object)$"EXPECTED SIDES on Piece '{piece.m_name}' {((Component)piece).transform.position}: {1}, ACTUAL SIDES: {list.Count}"); } return list; } private static List<ISide> FindSideOfBox(Piece piece) { return FindSidesOfBoxOrCube(piece, FormValidTwoDimensionalBoxSide, 1); } private static List<ISide> FindSidesOfCube(Piece piece) { return FindSidesOfBoxOrCube(piece, FormValidThreeDimensionalBoxSide(piece), 6); } private static List<ISide> FindSidesOfBoxOrCube(Piece piece, Func<Vector3, Vector3, Vector3, Vector3, bool> isValidSide, int numberOfSides) { //IL_012e: 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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_006