Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of TorvaldsAffordablePavers v1.1.0
plugins\torvalds-pavers.dll
Decompiled 8 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; 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; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("TorvaldsPavers")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("TorvaldsPavers")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e3243d22-4307-4008-ba36-9f326008cde5")] [assembly: AssemblyFileVersion("1.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] namespace TorvaldsPavers; public class PavingCartLever : MonoBehaviour, Interactable, Hoverable { private PavingCartPaver _paver; private PavingCartSmoke _smoke; private ZNetView _znv; private Transform _leverVisual; private bool _lastKnownState; private void Awake() { _paver = ((Component)this).GetComponentInParent<PavingCartPaver>(); _smoke = ((Component)this).GetComponentInParent<PavingCartSmoke>(); _znv = ((Component)this).GetComponentInParent<ZNetView>(); _leverVisual = ((Component)this).transform.Find("LeverVisual"); if ((Object)(object)_leverVisual == (Object)null) { _leverVisual = ((Component)this).transform.Find("FallbackLeverVisual"); } if ((Object)(object)_leverVisual == (Object)null) { CreateLeverVisual(); } } private void Start() { if (Object.op_Implicit((Object)(object)_znv) && _znv.IsValid()) { UpdateLeverRotation(_lastKnownState = _znv.GetZDO().GetBool("pave_enabled", false)); } } private void UpdateLeverRotation(bool isActive) { //IL_0047: 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) if (!((Object)(object)_leverVisual == (Object)null)) { if (isActive) { _leverVisual.localRotation = Quaternion.Euler(-45f, 0f, 0f); } else { _leverVisual.localRotation = Quaternion.Euler(-90f, 0f, 0f); } } } private void Update() { if (Object.op_Implicit((Object)(object)_znv) && _znv.IsValid()) { bool @bool = _znv.GetZDO().GetBool("pave_enabled", false); if (@bool != _lastKnownState) { _lastKnownState = @bool; UpdateLeverRotation(@bool); } } } public string GetHoverText() { if (!Object.op_Implicit((Object)(object)_paver) || !Object.op_Implicit((Object)(object)_znv) || !_znv.IsValid()) { return "\ud83d\udd27 Paving Control"; } if (_znv.GetZDO().GetBool("pave_enabled", false)) { return "\ud83d\udd27 <color=yellow>Paving Control</color>\\nStatus: <color=green>ACTIVE</color>\\n[<color=yellow>E</color>] Turn OFF"; } return "\ud83d\udd27 <color=yellow>Paving Control</color>\\nStatus: <color=red>INACTIVE</color>\\n[<color=yellow>E</color>] Turn ON"; } public string GetHoverName() { return "Paving Control"; } public bool Interact(Humanoid user, bool hold, bool alt) { if (!Object.op_Implicit((Object)(object)_paver) || !Object.op_Implicit((Object)(object)_znv) || !_znv.IsValid()) { return false; } if (hold) { return false; } bool flag = !_znv.GetZDO().GetBool("pave_enabled", false); _znv.InvokeRPC(ZNetView.Everybody, "RPC_PavingCart_SetEnabled", new object[1] { flag }); UpdateLeverRotation(flag); if (flag) { ((Character)user).Message((MessageType)2, "\ud83d\udee0\ufe0f Paving activated - pull cart to create stone paths", 0, (Sprite)null); } else { ((Character)user).Message((MessageType)2, "⏹\ufe0f Paving deactivated", 0, (Sprite)null); } return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } private void CreateLeverVisual() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_004d: 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_007c: Unknown result type (might be due to invalid IL or missing references) GameObject prefab = PrefabManager.Instance.GetPrefab("Club"); if (Object.op_Implicit((Object)(object)prefab)) { GameObject val = new GameObject("LeverVisual"); val.transform.SetParent(((Component)this).transform, false); val.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); val.transform.localPosition = Vector3.zero; val.transform.localRotation = Quaternion.Euler(-90f, 0f, 0f); MeshFilter componentInChildren = prefab.GetComponentInChildren<MeshFilter>(); MeshRenderer componentInChildren2 = prefab.GetComponentInChildren<MeshRenderer>(); if (Object.op_Implicit((Object)(object)componentInChildren) && Object.op_Implicit((Object)(object)componentInChildren2)) { val.AddComponent<MeshFilter>().mesh = componentInChildren.sharedMesh; ((Renderer)val.AddComponent<MeshRenderer>()).sharedMaterials = ((Renderer)componentInChildren2).sharedMaterials; Logger.LogInfo((object)"Successfully used Club model for paving lever"); _leverVisual = val.transform; } else { Logger.LogWarning((object)"Could not find Club mesh components - lever will be invisible"); } } else { Logger.LogWarning((object)"Could not find Club prefab - lever will be invisible"); } } } public class PavingCartPaver : MonoBehaviour, Interactable, Hoverable { [CompilerGenerated] private sealed class <DelayedInitialization>d__23 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public PavingCartPaver <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedInitialization>d__23(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00be: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; PavingCartPaver pavingCartPaver = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; goto IL_0042; case 1: <>1__state = -1; goto IL_0042; case 2: { <>1__state = -1; break; } IL_0042: if ((Object)(object)ZNet.instance == (Object)null) { <>2__current = null; <>1__state = 1; return true; } break; } if ((Object)(object)pavingCartPaver._znv == (Object)null || !pavingCartPaver._znv.IsValid()) { pavingCartPaver._znv = ((Component)pavingCartPaver).GetComponent<ZNetView>(); <>2__current = null; <>1__state = 2; return true; } DebugLog($"DelayedInit: ZNetView now valid. IsOwner={pavingCartPaver._znv.IsOwner()}, ZDO ID={pavingCartPaver._znv.GetZDO()?.m_uid}, IsServer={ZNet.instance.IsServer()}"); pavingCartPaver.RegisterRPCs(); if (pavingCartPaver._znv.IsOwner()) { pavingCartPaver._znv.GetZDO().Set("pave_enabled", pavingCartPaver.StartEnabled); DebugLog($"DelayedInit: Set initial enabled state to {pavingCartPaver.StartEnabled}"); } pavingCartPaver._enabled = pavingCartPaver._znv.GetZDO().GetBool("pave_enabled", pavingCartPaver.StartEnabled); pavingCartPaver.UpdateVisuals(); DebugLog($"DelayedInit: Cart enabled state is {pavingCartPaver._enabled}, initialization complete"); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public float CheckEveryMeters = 1f; public float PaveRadius = 1.2f; public int StonesPerStamp = 1; public string StoneItemName = "Stone"; public bool StartEnabled; public float ClutterClearScale = 1.05f; private ZNetView _znv; private float lastOperationTime; private Vector3 lastOperationPosition = Vector3.zero; private const float OPERATION_COOLDOWN = 1f; private const float MIN_DISTANCE = 2f; private Container _container; private PavingCartSmoke _smoke; private Vector3 _lastStampPos; private bool _enabled; private bool _serverInitialized; private bool _rpcsRegistered; private const string ZDOKeyEnabled = "pave_enabled"; private static bool DebugLogging => false; private static void DebugLog(string message) { Logger.LogInfo((object)("[PavingCart-Debug] " + message)); try { string path = Path.Combine(Application.dataPath, "..", "paving_cart_debug.log"); string text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string contents = "[" + text + "] [PavingCart-Debug] " + message + "\n"; File.AppendAllText(path, contents); } catch { } } private void Awake() { _znv = ((Component)this).GetComponent<ZNetView>(); _container = ((Component)this).GetComponentInChildren<Container>(); _smoke = ((Component)this).GetComponent<PavingCartSmoke>(); ZNet instance = ZNet.instance; object arg = ((instance != null) ? new bool?(instance.IsServer()) : null); ZNet instance2 = ZNet.instance; DebugLog($"AWAKE: PavingCart component created. IsServer={arg}, IsDedicated={((instance2 != null) ? new bool?(instance2.IsDedicated()) : null)}, ZNet exists={(Object)(object)ZNet.instance != (Object)null}"); ((MonoBehaviour)this).StartCoroutine(DelayedInitialization()); } private void Start() { ApplyCartTint(); } [IteratorStateMachine(typeof(<DelayedInitialization>d__23))] private IEnumerator DelayedInitialization() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedInitialization>d__23(0) { <>4__this = this }; } private void ApplyCartTint() { //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) try { MeshRenderer[] componentsInChildren = ((Component)this).GetComponentsInChildren<MeshRenderer>(); Color val = default(Color); ((Color)(ref val))..ctor(1.9f, 1.8f, 1.95f, 1f); int num = 0; int num2 = 0; MeshRenderer[] array = componentsInChildren; foreach (MeshRenderer val2 in array) { Transform val3 = ((Component)val2).transform; bool flag = false; while ((Object)(object)val3 != (Object)null && (Object)(object)val3 != (Object)(object)((Component)this).transform) { if (((Object)val3).name == "SurtlingCoreVisual" || ((Object)val3).name == "CoreVisual") { flag = true; break; } if (((Object)val3).name == "PavingLever" || ((Object)val3).name == "LeverVisual" || ((Object)val3).name == "FallbackLeverVisual") { flag = true; break; } val3 = val3.parent; } if (flag) { num++; continue; } Material[] materials = ((Renderer)val2).materials; bool flag2 = false; foreach (Material val4 in materials) { if (val4.HasProperty("_Color")) { val4.color = val; flag2 = true; } if (val4.HasProperty("_MainColor")) { val4.SetColor("_MainColor", val); flag2 = true; } if (val4.HasProperty("_TintColor")) { val4.SetColor("_TintColor", val); flag2 = true; } if (val4.HasProperty("_Metallic")) { val4.SetFloat("_Metallic", 0.2f); flag2 = true; } if (val4.HasProperty("_Smoothness")) { val4.SetFloat("_Smoothness", 0.3f); flag2 = true; } else if (val4.HasProperty("_Glossiness")) { val4.SetFloat("_Glossiness", 0.3f); flag2 = true; } } if (flag2) { ((Renderer)val2).materials = materials; num2++; } } Logger.LogInfo((object)$"PavingCart: Applied bright silver tint to {num2} renderers, skipped {num} components"); } catch (Exception ex) { Logger.LogError((object)("PavingCart: Error applying tint: " + ex.Message)); } } private void RegisterRPCs() { //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) //IL_004f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_znv == (Object)null || !_znv.IsValid()) { DebugLog("RegisterRPCs: ZNetView not valid, skipping RPC registration"); return; } if (_rpcsRegistered) { DebugLog("RegisterRPCs: RPCs already registered, skipping"); return; } ZDOID uid = _znv.GetZDO().m_uid; object arg = uid; ZNet instance = ZNet.instance; DebugLog($"RegisterRPCs: Registering RPCs for cart ZDOID={arg}, IsServer={((instance != null) ? new bool?(instance.IsServer()) : null)}"); _znv.Register<bool>("RPC_PavingCart_SetEnabled", (Action<long, bool>)RPC_SetEnabled); if (ZRoutedRpc.instance == null) { DebugLog("RegisterRPCs: WARNING - ZRoutedRpc.instance is null!"); } else { DebugLog("RegisterRPCs: Global routed RPCs handled by main plugin, skipping local registration"); } _rpcsRegistered = true; DebugLog("RegisterRPCs: All RPCs registered successfully"); } private void RPC_SetEnabled(long sender, bool on) { DebugLog($"RPC_SetEnabled received from {sender}: {on}"); _enabled = on; if (_znv.IsOwner()) { _znv.GetZDO().Set("pave_enabled", on); } UpdateVisuals(); } private void RPC_DoPave_Server(long sender, ZDOID cartZDOID, Vector3 pos, float radius) { //IL_0016: 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_005c: Unknown result type (might be due to invalid IL or missing references) DebugLog($"RPC_DoPave_Server: Received from {sender} for cart {cartZDOID} at {pos} radius {radius}"); if (!ZNet.instance.IsServer()) { DebugLog("RPC_DoPave_Server: Not server, ignoring"); return; } DebugLog("RPC_DoPave_Server: Server processing pave request (legacy path)"); ApplyPave(pos, radius); } private void RPC_DoLevelOnly_Server(long sender, ZDOID cartZDOID, Vector3 pos, float radius) { //IL_0016: 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_005c: Unknown result type (might be due to invalid IL or missing references) DebugLog($"RPC_DoLevelOnly_Server: Received from {sender} for cart {cartZDOID} at {pos} radius {radius}"); if (!ZNet.instance.IsServer()) { DebugLog("RPC_DoLevelOnly_Server: Not server, ignoring"); return; } DebugLog("RPC_DoLevelOnly_Server: Server processing level request (legacy path)"); ApplyLevelOnly(pos, radius); } public void ApplyPaveGlobal(Vector3 pos, float radius) { //IL_0005: 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) DebugLog($"ApplyPaveGlobal: Called from global handler at {pos} radius {radius}"); if (!ZNet.instance.IsServer()) { DebugLog("ApplyPaveGlobal: Not server, aborting"); } else { ApplyPave(pos, radius); } } public void ApplyLevelOnlyGlobal(Vector3 pos, float radius) { //IL_0005: 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) DebugLog($"ApplyLevelOnlyGlobal: Called from global handler at {pos} radius {radius}"); if (!ZNet.instance.IsServer()) { DebugLog("ApplyLevelOnlyGlobal: Not server, aborting"); } else { ApplyLevelOnly(pos, radius); } } private void OnEnable() { ZNet instance = ZNet.instance; DebugLog($"ONENABLE: Component enabled. IsServer={((instance != null) ? new bool?(instance.IsServer()) : null)}, ZNV exists={(Object)(object)_znv != (Object)null}"); } private void InitializeServerSide() { ZNet instance = ZNet.instance; DebugLog($"InitializeServerSide: Ensuring server-side cart is properly set up. IsServer={((instance != null) ? new bool?(instance.IsServer()) : null)}"); DebugLog("InitializeServerSide: RPCs already registered during initialization"); _serverInitialized = true; DebugLog("InitializeServerSide: Server-side initialization complete"); } private void UpdateVisuals() { _smoke?.SetActive(_enabled); } public string GetHoverText() { return "<color=yellow>Paving Cart</color>\\n[<color=yellow>Use (E)</color>] Toggle paving (" + (_enabled ? "On" : "Off") + ")"; } public string GetHoverName() { return "Paving Cart"; } public bool Interact(Humanoid user, bool hold, bool alt) { if (!Object.op_Implicit((Object)(object)_znv) || !_znv.IsValid()) { return false; } if (hold) { return false; } bool flag = !_znv.GetZDO().GetBool("pave_enabled", StartEnabled); DebugLog($"Interact: Toggling paving from {!flag} to {flag}"); _znv.InvokeRPC(ZNetView.Everybody, "RPC_PavingCart_SetEnabled", new object[1] { flag }); ((Character)user).Message((MessageType)2, "Paving " + (flag ? "Enabled" : "Disabled"), 0, (Sprite)null); return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } private void Update() { //IL_0056: 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_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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)_znv) || !_znv.IsValid()) { return; } if ((Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer() && !_serverInitialized) { InitializeServerSide(); } if (!_znv.IsOwner()) { return; } Vector3 position = ((Component)this).transform.position; if (!_enabled) { _lastStampPos = position; return; } if (_lastStampPos == Vector3.zero) { _lastStampPos = position; } float num = Vector3.Distance(position, _lastStampPos); if (num < CheckEveryMeters) { return; } DebugLog($"Paving triggered: Distance={num:F2}m, Position={position}"); Vector3 val = position + Vector3.down * 0.2f; if (HasStones(StonesPerStamp)) { DebugLog($"Has stones, consuming and requesting full paving at {val}"); if (TryConsumeStone(StonesPerStamp)) { RPC_Pave(val, PaveRadius); } else { DebugLog("Stone consumption failed, falling back to level-only"); RPC_LevelOnly(val, PaveRadius); } } else { DebugLog($"No stones, requesting level-only at {val}"); RPC_LevelOnly(val, PaveRadius); } _lastStampPos = position; } private bool HasStones(int amount) { if ((Object)(object)_container == (Object)null) { return false; } Inventory inventory = _container.GetInventory(); if (inventory == null) { return false; } return inventory.GetAllItems().Where(delegate(ItemData item) { if (item.m_shared?.m_name == null) { return false; } string name = item.m_shared.m_name; return string.Equals(name, StoneItemName, StringComparison.OrdinalIgnoreCase) || string.Equals(name, "$" + StoneItemName, StringComparison.OrdinalIgnoreCase) || name.IndexOf("stone", StringComparison.OrdinalIgnoreCase) >= 0; }).ToList() .Sum((ItemData item) => item.m_stack) >= amount; } private bool TryConsumeStone(int amount) { DebugLog($"TryConsumeStone: Attempting to consume {amount} stones"); if ((Object)(object)_container == (Object)null) { Logger.LogWarning((object)"PavingCart: No container for stone consumption"); DebugLog("TryConsumeStone: No container found"); return false; } Inventory inventory = _container.GetInventory(); if (inventory == null) { Logger.LogWarning((object)"PavingCart: No inventory for stone consumption"); DebugLog("TryConsumeStone: No inventory in container"); return false; } List<ItemData> source = inventory.GetAllItems().Where(delegate(ItemData item) { if (item.m_shared?.m_name == null) { return false; } string name = item.m_shared.m_name; return string.Equals(name, StoneItemName, StringComparison.OrdinalIgnoreCase) || string.Equals(name, "$" + StoneItemName, StringComparison.OrdinalIgnoreCase) || name.IndexOf("stone", StringComparison.OrdinalIgnoreCase) >= 0; }).ToList(); int num = source.Sum((ItemData item) => item.m_stack); DebugLog($"TryConsumeStone: Found {num} stones in inventory"); if (num < amount) { DebugLog($"TryConsumeStone: Not enough stones ({num} < {amount})"); return false; } int num2 = amount; foreach (ItemData item in source.OrderBy((ItemData x) => x.m_shared.m_name)) { if (num2 <= 0) { break; } int num3 = Math.Min(num2, item.m_stack); inventory.RemoveItem(item.m_shared.m_name, num3, -1, true); num2 -= num3; DebugLog($"TryConsumeStone: Removed {num3} {item.m_shared.m_name}, {num2} left to remove"); } _container.m_inventory.Changed(); bool flag = num2 == 0; DebugLog("TryConsumeStone: Consumption " + (flag ? "successful" : "failed")); return flag; } private void RPC_Pave(Vector3 worldPos, float radius) { //IL_0031: 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) //IL_003c: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_znv == (Object)null || !_znv.IsValid()) { DebugLog("RPC_Pave: Invalid ZNetView, cannot send RPC"); return; } ZDOID uid = _znv.GetZDO().m_uid; DebugLog($"RPC_Pave: Sending DoPave RPC to server for cart {uid} at {worldPos} radius {radius}"); if (ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC(0L, "PavingCart_DoPave", new object[3] { uid, worldPos, radius }); } else { DebugLog("RPC_Pave: ERROR - ZRoutedRpc.instance is null!"); } } private void ApplyPave(Vector3 center, float radius) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) DebugLog($"ApplyPave: Starting at {center} radius {radius}"); if (!Object.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer()) { Logger.LogWarning((object)"ApplyPave called on client - ignoring"); DebugLog("ApplyPave: Not server, aborting"); return; } DebugLog("ApplyPave: Server check passed, attempting stone consumption"); if (!TryConsumeStone(StonesPerStamp)) { DebugLog("ApplyPave: Stone consumption failed, falling back to level-only"); ApplyLevelOnly(center, radius); } else { DebugLog("ApplyPave: Stone consumed successfully, applying paved terrain"); Server_TerrainOp(center, radius, "Paved"); } } private void Server_TerrainOp(Vector3 center, float radius, string paintName) { //IL_0005: 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_002d: 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_00cf: 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_00d6: Unknown result type (might be due to invalid IL or missing references) DebugLog($"Server_TerrainOp: Starting at {center} radius {radius} paint {paintName}"); float time = Time.time; float num = time - lastOperationTime; float num2 = Vector3.Distance(center, lastOperationPosition); if (num < 1f) { DebugLog($"Server_TerrainOp: Skipping - cooldown active ({num:F2}s < {1f}s)"); return; } if (num2 < 2f && lastOperationPosition != Vector3.zero) { DebugLog($"Server_TerrainOp: Skipping - too close to last op ({num2:F2}m < {2f}m)"); return; } if (!Object.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer()) { DebugLog("Server_TerrainOp: Not server, aborting"); return; } DebugLog("Server_TerrainOp: All checks passed, creating terrain piece"); lastOperationTime = time; lastOperationPosition = center; CreateTerrainPiece(center, radius, paintName); } private void CreateTerrainPiece(Vector3 center, float radius, string paintName) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) DebugLog($"CreateTerrainPiece: Starting at {center} radius {radius} paint {paintName}"); string text = "paved_road_v2"; text = paintName.ToLower() switch { "dirt" => "mud_road_v2", "path" => "path_v2", _ => "paved_road_v2", }; DebugLog("CreateTerrainPiece: Using prefab " + text); GameObject prefab = PrefabManager.Instance.GetPrefab(text); if ((Object)(object)prefab == (Object)null) { Logger.LogError((object)("Could not find prefab: " + text)); DebugLog("CreateTerrainPiece: ERROR - Prefab " + text + " not found!"); return; } DebugLog("CreateTerrainPiece: Prefab found, instantiating"); GameObject val = Object.Instantiate<GameObject>(prefab, center, Quaternion.identity); if ((Object)(object)val == (Object)null) { Logger.LogError((object)("Failed to instantiate terrain piece: " + text)); DebugLog("CreateTerrainPiece: ERROR - Failed to instantiate " + text + "!"); return; } DebugLog("CreateTerrainPiece: Terrain piece instantiated, configuring settings"); TerrainOp component = val.GetComponent<TerrainOp>(); if ((Object)(object)component != (Object)null) { Settings settings = component.m_settings; settings.m_level = true; settings.m_levelRadius = radius; settings.m_smooth = true; settings.m_smoothRadius = radius; if (settings.m_paintRadius > 0f) { settings.m_paintRadius = radius; } DebugLog($"CreateTerrainPiece: TerrainOp configured - level={settings.m_level}, levelRadius={settings.m_levelRadius}, smooth={settings.m_smooth}, smoothRadius={settings.m_smoothRadius}, paintRadius={settings.m_paintRadius}"); } else { DebugLog("CreateTerrainPiece: WARNING - No TerrainOp component found on " + text); } float num = radius * ClutterClearScale; ClutterSystem instance = ClutterSystem.instance; if (instance != null) { instance.ResetGrass(center, num); } DebugLog($"CreateTerrainPiece: Completed successfully, clutter cleared at radius {num}"); } private void RPC_LevelOnly(Vector3 worldPos, float radius) { //IL_0031: 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) //IL_003c: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_znv == (Object)null || !_znv.IsValid()) { DebugLog("RPC_LevelOnly: Invalid ZNetView, cannot send RPC"); return; } ZDOID uid = _znv.GetZDO().m_uid; DebugLog($"RPC_LevelOnly: Sending DoLevelOnly RPC to server for cart {uid} at {worldPos} radius {radius}"); if (ZRoutedRpc.instance != null) { ZRoutedRpc.instance.InvokeRoutedRPC(0L, "PavingCart_DoLevelOnly", new object[3] { uid, worldPos, radius }); } else { DebugLog("RPC_LevelOnly: ERROR - ZRoutedRpc.instance is null!"); } } private void ApplyLevelOnly(Vector3 center, float radius) { //IL_0005: 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) DebugLog($"ApplyLevelOnly: Starting at {center} radius {radius}"); if (!Object.op_Implicit((Object)(object)ZNet.instance) || !ZNet.instance.IsServer()) { Logger.LogWarning((object)"ApplyLevelOnly called on client - ignoring"); DebugLog("ApplyLevelOnly: Not server, aborting"); } else { DebugLog("ApplyLevelOnly: Server check passed, applying dirt terrain"); Server_TerrainOp(center, radius, "Dirt"); } } } public class PavingCartRunner : MonoBehaviour { private static PavingCartRunner _instance; public static void Ensure() { //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_001e: Expected O, but got Unknown if (!((Object)(object)_instance != (Object)null)) { GameObject val = new GameObject("PavingCartRunner"); Object.DontDestroyOnLoad((Object)val); _instance = val.AddComponent<PavingCartRunner>(); } } public static Coroutine Run(IEnumerator routine) { if ((Object)(object)_instance == (Object)null) { return null; } return ((MonoBehaviour)_instance).StartCoroutine(routine); } } public class PavingCartSmoke : MonoBehaviour { public Vector3 LocalOffset = new Vector3(0f, 0.8f, 0f); private GameObject _smokeGO; private ParticleSystem _ps; private void Awake() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0033: 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_0073: 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_0095: 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_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Expected O, but got Unknown //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Expected O, but got Unknown //IL_021f: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Unknown result type (might be due to invalid IL or missing references) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_0305: Expected O, but got Unknown _smokeGO = new GameObject("PavingCartSmoke"); _smokeGO.transform.SetParent(((Component)this).transform, false); _smokeGO.transform.localPosition = LocalOffset; Logger.LogInfo((object)"Creating sparks particle effect for stone grinding"); _ps = _smokeGO.AddComponent<ParticleSystem>(); MainModule main = _ps.main; ((MainModule)(ref main)).loop = true; ((MainModule)(ref main)).startLifetime = MinMaxCurve.op_Implicit(0.8f); ((MainModule)(ref main)).startSpeed = MinMaxCurve.op_Implicit(4f); ((MainModule)(ref main)).startSize = MinMaxCurve.op_Implicit(0.05f); ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(1f, 0.6f, 0.2f, 1f)); ((MainModule)(ref main)).simulationSpace = (ParticleSystemSimulationSpace)1; EmissionModule emission = _ps.emission; ((EmissionModule)(ref emission)).rateOverTime = MinMaxCurve.op_Implicit(15f); ((EmissionModule)(ref emission)).SetBursts((Burst[])(object)new Burst[1] { new Burst(0f, (short)3, (short)8, 1, 1f) }); ShapeModule shape = _ps.shape; ((ShapeModule)(ref shape)).shapeType = (ParticleSystemShapeType)4; ((ShapeModule)(ref shape)).angle = 30f; ((ShapeModule)(ref shape)).radius = 0.15f; ((ShapeModule)(ref shape)).rotation = new Vector3(-90f, 0f, 0f); VelocityOverLifetimeModule velocityOverLifetime = _ps.velocityOverLifetime; ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).enabled = true; ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).space = (ParticleSystemSimulationSpace)0; ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).y = MinMaxCurve.op_Implicit(-2f); ((VelocityOverLifetimeModule)(ref velocityOverLifetime)).radial = MinMaxCurve.op_Implicit(0.3f); SizeOverLifetimeModule sizeOverLifetime = _ps.sizeOverLifetime; ((SizeOverLifetimeModule)(ref sizeOverLifetime)).enabled = true; AnimationCurve val = new AnimationCurve(); val.AddKey(0f, 1f); val.AddKey(1f, 0.2f); ((SizeOverLifetimeModule)(ref sizeOverLifetime)).size = new MinMaxCurve(1f, val); ColorOverLifetimeModule colorOverLifetime = _ps.colorOverLifetime; ((ColorOverLifetimeModule)(ref colorOverLifetime)).enabled = true; Gradient val2 = new Gradient(); val2.SetKeys((GradientColorKey[])(object)new GradientColorKey[3] { new GradientColorKey(new Color(1f, 0.8f, 0.3f), 0f), new GradientColorKey(new Color(1f, 0.4f, 0.1f), 0.5f), new GradientColorKey(new Color(0.8f, 0.2f, 0f), 1f) }, (GradientAlphaKey[])(object)new GradientAlphaKey[3] { new GradientAlphaKey(1f, 0f), new GradientAlphaKey(0.8f, 0.5f), new GradientAlphaKey(0f, 1f) }); ((ColorOverLifetimeModule)(ref colorOverLifetime)).color = MinMaxGradient.op_Implicit(val2); ParticleSystemRenderer component = ((Component)_ps).GetComponent<ParticleSystemRenderer>(); if ((Object)(object)component != (Object)null) { ((Renderer)component).material = new Material(Shader.Find("Sprites/Default")); } SetActive(on: false); } public void SetActive(bool on) { //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) if (!((Object)(object)_smokeGO == (Object)null) && !((Object)(object)_ps == (Object)null)) { EmissionModule emission = _ps.emission; ((EmissionModule)(ref emission)).enabled = on; if (on && !_ps.isPlaying) { _ps.Play(true); } if (!on && _ps.isPlaying) { _ps.Stop(true, (ParticleSystemStopBehavior)1); } _smokeGO.SetActive(on); } } } public class StoneOnlyContainer : MonoBehaviour { public string StoneItemName = "Stone"; public Container TargetContainer; private float _scanTimer; private void Update() { //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)TargetContainer)) { return; } _scanTimer += Time.deltaTime; if (_scanTimer < 0.75f) { return; } _scanTimer = 0f; Inventory inventory = TargetContainer.GetInventory(); if (inventory == null) { return; } foreach (ItemData item in inventory.GetAllItems().ToList()) { if (item.m_shared != null && item.m_shared.m_name != null) { string name = item.m_shared.m_name; if (!string.Equals(name, StoneItemName, StringComparison.OrdinalIgnoreCase) && !string.Equals(name, "$" + StoneItemName, StringComparison.OrdinalIgnoreCase) && name.IndexOf("stone", StringComparison.OrdinalIgnoreCase) < 0 && inventory.RemoveItem(item, item.m_stack)) { Vector3 val = ((Component)TargetContainer).transform.position + Vector3.right * 0.5f; ItemDrop.DropItem(item, item.m_stack, val, Quaternion.identity); } } } } } [HarmonyPatch(typeof(Inventory), "AddItem", new Type[] { typeof(ItemData) })] public static class Inventory_AddItem_Patch { private static bool Prefix(Inventory __instance, ItemData item, ref bool __result) { Container val = ((__instance.m_name == "Paving Cart") ? FindContainerForInventory(__instance) : null); if ((Object)(object)val == (Object)null || !((Object)((Component)val).gameObject).name.StartsWith("PavingCart")) { return true; } Logger.LogDebug((object)("Trying to add item: " + item.m_shared.m_name)); string name = item.m_shared.m_name; if (!string.Equals(name, "Stone", StringComparison.OrdinalIgnoreCase) && !string.Equals(name, "$Stone", StringComparison.OrdinalIgnoreCase) && name.IndexOf("stone", StringComparison.OrdinalIgnoreCase) < 0) { Player localPlayer = Player.m_localPlayer; if (localPlayer != null) { ((Character)localPlayer).Message((MessageType)2, "⚠\ufe0f Paving Cart only accepts stone materials", 0, (Sprite)null); } __result = false; return false; } return true; } private static Container FindContainerForInventory(Inventory inventory) { Container[] array = Object.FindObjectsByType<Container>((FindObjectsSortMode)0); foreach (Container val in array) { if (val.GetInventory() == inventory) { return val; } } return null; } } [HarmonyPatch(typeof(Container), "GetHoverText")] public static class Container_GetHoverText_Patch { private static bool Prefix(Container __instance, ref string __result) { if (!((Object)((Component)__instance).gameObject).name.StartsWith("PavingCart")) { return true; } PavingCartPaver componentInParent = ((Component)__instance).GetComponentInParent<PavingCartPaver>(); if (!Object.op_Implicit((Object)(object)componentInParent)) { return true; } __result = componentInParent.GetHoverText(); return false; } } [HarmonyPatch(typeof(Vagon), "GetHoverName")] public static class Vagon_GetHoverName_Patch { private static void Postfix(Vagon __instance, ref string __result) { if (Object.op_Implicit((Object)(object)__instance) && Object.op_Implicit((Object)(object)((Component)__instance).gameObject) && ((Object)((Component)__instance).gameObject).name.StartsWith("PavingCart")) { if (Localization.instance != null) { __result = Localization.instance.Localize("$piece_pavingcart_name"); } else { __result = "Paving Cart"; } } } } [BepInPlugin("com.torvald.pavers", "Torvald's Affordable Pavers", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class TorvaldsPavers : BaseUnityPlugin { public const string PluginGUID = "com.torvald.pavers"; public const string PluginName = "Torvald's Affordable Pavers"; public const string PluginVersion = "1.0.0"; private const string PavingCartPrefabName = "PavingCart"; private const string VanillaCartPrefab = "Cart"; private const string StoneItemName = "Stone"; private Harmony _harmony; private static TorvaldsPavers _instance; private void Awake() { //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown _instance = this; ((BaseUnityPlugin)this).Logger.LogInfo((object)"TORVALDS PAVERS MOD LOADING - SERVER TEST"); Console.WriteLine("TORVALDS PAVERS: MOD LOADING ON SERVER - CONSOLE TEST"); try { string path = "torvalds_pavers_server_test.log"; string text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); object[] obj = new object[4] { text, null, null, null }; ZNet instance = ZNet.instance; obj[1] = ((instance != null) ? new bool?(instance.IsServer()) : null); ZNet instance2 = ZNet.instance; obj[2] = ((instance2 != null) ? new bool?(instance2.IsDedicated()) : null); obj[3] = Directory.GetCurrentDirectory(); string contents = string.Format("[{0}] TORVALDS PAVERS MOD AWAKE - IsServer={1}, IsDedicated={2}, WorkingDir={3}\n", obj); File.AppendAllText(path, contents); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("Failed to write test log file: " + ex.Message)); Console.WriteLine("TORVALDS PAVERS: Failed to write log file: " + ex.Message); } _harmony = new Harmony("com.torvald.pavers"); _harmony.PatchAll(); PavingCartRunner.Ensure(); PrefabManager.OnVanillaPrefabsAvailable += OnVanillaReady; RegisterServerRPCs(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Torvald's Affordable Pavers has landed"); } private void OnDestroy() { PrefabManager.OnVanillaPrefabsAvailable -= OnVanillaReady; Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } private void RegisterServerRPCs() { PrefabManager.OnPrefabsRegistered += delegate { if (ZRoutedRpc.instance != null) { ZRoutedRpc.instance.Register<ZDOID, Vector3, float>("PavingCart_DoPave", (Action<long, ZDOID, Vector3, float>)_instance.GlobalRPC_DoPave); ZRoutedRpc.instance.Register<ZDOID, Vector3, float>("PavingCart_DoLevelOnly", (Action<long, ZDOID, Vector3, float>)_instance.GlobalRPC_DoLevelOnly); ZRoutedRpc.instance.Register<Vector3, float, string>("PavingCart_ExecuteTerrainOp", (Action<long, Vector3, float, string>)_instance.RPC_ExecuteTerrainOp); } }; } private void GlobalRPC_DoPave(long sender, ZDOID cartZDOID, Vector3 pos, float radius) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if (ZNet.instance.IsServer()) { ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "PavingCart_ExecuteTerrainOp", new object[3] { pos, radius, "Paved" }); } } private void GlobalRPC_DoLevelOnly(long sender, ZDOID cartZDOID, Vector3 pos, float radius) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if (ZNet.instance.IsServer()) { ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "PavingCart_ExecuteTerrainOp", new object[3] { pos, radius, "Dirt" }); } } private void RPC_ExecuteTerrainOp(long sender, Vector3 pos, float radius, string paintName) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) CreateTerrainPieceLocal(pos, radius, paintName); } private PavingCartPaver FindCartPaverByZDOID(ZDOID zdoid) { //IL_000b: 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_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008e: 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) ((BaseUnityPlugin)this).Logger.LogInfo((object)$"FindCartPaverByZDOID: Searching for cart with ZDOID {zdoid}"); PavingCartPaver[] array = Object.FindObjectsByType<PavingCartPaver>((FindObjectsSortMode)0); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"FindCartPaverByZDOID: Found {array.Length} cart pavers in scene"); PavingCartPaver[] array2 = array; foreach (PavingCartPaver pavingCartPaver in array2) { ZNetView component = ((Component)pavingCartPaver).GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null && component.IsValid()) { ZDOID uid = component.GetZDO().m_uid; ((BaseUnityPlugin)this).Logger.LogInfo((object)$"FindCartPaverByZDOID: Checking paver with ZDOID {uid}"); if (uid == zdoid) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"FindCartPaverByZDOID: Found matching cart paver!"); return pavingCartPaver; } } } ((BaseUnityPlugin)this).Logger.LogWarning((object)$"FindCartPaverByZDOID: No matching cart found for ZDOID {zdoid}"); return null; } private void CreateTerrainPieceLocal(Vector3 center, float radius, string paintName) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) string text = paintName.ToLower(); string text2 = ((text == "dirt") ? "mud_road_v2" : ((!(text == "path")) ? "paved_road_v2" : "path_v2")); string text3 = text2; GameObject prefab = PrefabManager.Instance.GetPrefab(text3); if ((Object)(object)prefab == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)("CreateTerrainPieceLocal: Could not find prefab: " + text3)); return; } GameObject val = Object.Instantiate<GameObject>(prefab, center, Quaternion.identity); if ((Object)(object)val == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)("CreateTerrainPieceLocal: Failed to instantiate terrain piece: " + text3)); return; } TerrainOp component = val.GetComponent<TerrainOp>(); if ((Object)(object)component != (Object)null) { Settings settings = component.m_settings; settings.m_level = true; settings.m_levelRadius = radius; settings.m_smooth = true; settings.m_smoothRadius = radius; if (settings.m_paintRadius > 0f) { settings.m_paintRadius = radius; } component.OnPlaced(); } else { ((BaseUnityPlugin)this).Logger.LogWarning((object)("CreateTerrainPieceLocal: No TerrainOp component found on " + text3)); } ClutterSystem instance = ClutterSystem.instance; if (instance != null) { instance.ResetGrass(center, radius * 1.5f); } } private void OnVanillaReady() { try { CreatePavingCart(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Paving Cart content registered."); } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.LogError((object)$"Failed to register paving cart content: {arg}"); } } private void CreatePavingCart() { //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Expected O, but got Unknown //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Expected O, but got Unknown CreateTerrainStampPrefab(); CustomLocalization localization = LocalizationManager.Instance.GetLocalization(); string text = "English"; localization.AddTranslation(ref text, new Dictionary<string, string> { { "$piece_pavingcart_name", "Paving Cart" }, { "$piece_pavingcart_desc", "Load with stone, pull to lay paved path." } }); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Attempting to find vanilla cart prefab: Cart"); GameObject prefab = PrefabManager.Instance.GetPrefab("Cart"); if (!Object.op_Implicit((Object)(object)prefab)) { ((BaseUnityPlugin)this).Logger.LogError((object)"Vanilla Cart prefab not found"); return; } ((BaseUnityPlugin)this).Logger.LogInfo((object)"Creating cloned prefab: PavingCart"); GameObject val = PrefabManager.Instance.CreateClonedPrefab("PavingCart", prefab); if (!Object.op_Implicit((Object)(object)val)) { ((BaseUnityPlugin)this).Logger.LogError((object)"Failed to clone cart prefab"); return; } Piece component = val.GetComponent<Piece>(); if (Object.op_Implicit((Object)(object)component)) { component.m_name = "$piece_pavingcart_name"; component.m_description = "$piece_pavingcart_desc"; } if (!Object.op_Implicit((Object)(object)val.GetComponent<PavingCartPaver>())) { val.AddComponent<PavingCartPaver>(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"=== PAVING CART PAVER COMPONENT ADDED ===="); } if (!Object.op_Implicit((Object)(object)val.GetComponent<PavingCartSmoke>())) { val.AddComponent<PavingCartSmoke>(); } CreatePavingLever(val); CreateSurtlingCoreVisual(val); Container componentInChildren = val.GetComponentInChildren<Container>(); if (Object.op_Implicit((Object)(object)componentInChildren)) { componentInChildren.m_name = "Paving Cart"; if (!Object.op_Implicit((Object)(object)val.GetComponent<StoneOnlyContainer>())) { StoneOnlyContainer stoneOnlyContainer = val.AddComponent<StoneOnlyContainer>(); stoneOnlyContainer.StoneItemName = "Stone"; stoneOnlyContainer.TargetContainer = componentInChildren; } } ((BaseUnityPlugin)this).Logger.LogDebug((object)"Paving Cart prefab created, registering as buildable piece"); PieceConfig val2 = new PieceConfig { Name = "$piece_pavingcart_name", Description = "$piece_pavingcart_desc", PieceTable = "Hammer", Category = "Misc" }; val2.AddRequirement("SurtlingCore", 2, true); val2.AddRequirement("ElderBark", 20, true); val2.AddRequirement("BronzeNails", 10, true); val2.AddRequirement("Iron", 2, true); val2.AddRequirement("Stone", 8, true); PieceManager.Instance.AddPiece(new CustomPiece(val, true, val2)); ((BaseUnityPlugin)this).Logger.LogDebug((object)"Paving Cart piece and recipe registered"); } private void CreateTerrainStampPrefab() { //IL_0005: 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_0011: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown GameObject val = new GameObject("Paver_TerrainStamp"); val.AddComponent<ZNetView>().m_type = (ObjectType)0; TerrainModifier obj = val.AddComponent<TerrainModifier>(); obj.m_level = true; obj.m_levelRadius = 2.4f; obj.m_levelOffset = 0f; obj.m_square = false; obj.m_paintRadius = 2.4f; obj.m_paintType = (PaintType)0; CustomPrefab val2 = new CustomPrefab(val, false); PrefabManager.Instance.AddPrefab(val2); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Terrain stamp prefab created and registered"); } private void CreatePavingLever(GameObject cartClone) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_0032: 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_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("PavingLever"); val.transform.SetParent(cartClone.transform, false); val.transform.localPosition = new Vector3(0.7f, 0.8f, 0f); val.transform.localRotation = Quaternion.identity; val.transform.localScale = Vector3.one; val.layer = cartClone.layer; SphereCollider obj = val.AddComponent<SphereCollider>(); obj.radius = 0.5f; ((Collider)obj).isTrigger = false; val.AddComponent<PavingCartLever>(); ((BaseUnityPlugin)this).Logger.LogInfo((object)$"Created paving control lever at position {val.transform.position}, layer {val.layer}"); } private void CreateSurtlingCoreVisual(GameObject cartClone) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0060: 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_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) try { GameObject prefab = PrefabManager.Instance.GetPrefab("SurtlingCore"); if ((Object)(object)prefab == (Object)null) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"SurtlingCore prefab not found - skipping visual"); return; } GameObject val = new GameObject("SurtlingCoreVisual"); val.transform.SetParent(cartClone.transform, false); val.transform.localPosition = new Vector3(0.7f, 0.6f, 0f); val.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); if ((Object)(object)prefab.GetComponent<ItemDrop>() != (Object)null) { Transform val2 = null; foreach (Transform item in prefab.transform) { Transform val3 = item; if (((Object)val3).name.ToLower().Contains("attach") || (Object)(object)((Component)val3).GetComponentInChildren<MeshRenderer>() != (Object)null || (Object)(object)((Component)val3).GetComponentInChildren<ParticleSystem>() != (Object)null) { val2 = val3; break; } } if ((Object)(object)val2 == (Object)null && prefab.transform.childCount > 0) { val2 = prefab.transform.GetChild(0); } if ((Object)(object)val2 != (Object)null) { GameObject val4 = Object.Instantiate<GameObject>(((Component)val2).gameObject, val.transform); val4.transform.localPosition = Vector3.zero; val4.transform.localRotation = Quaternion.identity; ((Object)val4).name = "CoreVisual"; Collider[] componentsInChildren = val4.GetComponentsInChildren<Collider>(); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)componentsInChildren[i]); } ParticleSystem[] componentsInChildren2 = val4.GetComponentsInChildren<ParticleSystem>(); for (int i = 0; i < componentsInChildren2.Length; i++) { componentsInChildren2[i].Play(); } ((BaseUnityPlugin)this).Logger.LogInfo((object)"Successfully added SurtlingCore visual to paving cart"); } else { ((BaseUnityPlugin)this).Logger.LogWarning((object)"Could not find visual model in SurtlingCore prefab"); } } else { ((BaseUnityPlugin)this).Logger.LogWarning((object)"SurtlingCore prefab missing ItemDrop component"); } } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Failed to add SurtlingCore visual: " + ex.Message)); } } } [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Patch { public static void Postfix(ZNetScene __instance) { GameObject prefab = __instance.GetPrefab("PavingCart"); if ((Object)(object)prefab != (Object)null) { EnsureServerComponents(prefab); } } private static void EnsureServerComponents(GameObject prefab) { if (!Object.op_Implicit((Object)(object)prefab.GetComponent<PavingCartPaver>())) { prefab.AddComponent<PavingCartPaver>(); Logger.LogInfo((object)"[Server] Added PavingCartPaver component to prefab"); } } } [HarmonyPatch(typeof(ZNetView), "Awake")] public static class ZNetView_Awake_Patch { public static void Postfix(ZNetView __instance) { if (((Object)__instance).name.StartsWith("PavingCart") && !Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<PavingCartPaver>())) { ((Component)__instance).gameObject.AddComponent<PavingCartPaver>(); ZNet instance = ZNet.instance; Logger.LogInfo((object)$"[Server] Added PavingCartPaver to spawned cart instance. IsServer={((instance != null) ? new bool?(instance.IsServer()) : null)}"); } } }