using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Jotunn; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Jotunn.Utils; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyCompany("BaseAssistant")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Base Assistant Mod for Valheim")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+991da4ea4f056543d98b86a411fbed444f92aa4f")] [assembly: AssemblyProduct("BaseAssistant")] [assembly: AssemblyTitle("BaseAssistant")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace BaseAssistant { public class AssistantAI : MonoBehaviour { private ZNetView _nview; private Character _character; private MonsterAI _monsterAI; private Humanoid _humanoid; private bool _itemsHidden = false; private float _scanInterval = 2f; private float _timeSinceLastScan = 0f; private float _greetCooldown = 0f; private float _taskTimeout = 0f; private GameObject _targetObj; private string _currentTask = "Idle"; private string _lastTaskCategory = ""; private ItemData _heldItemData = null; private bool _weaponsCleared = false; private Dictionary _blacklistedObjects = new Dictionary(); public static HashSet ReservedItems = new HashSet(); private ZDOID _reservedZDOID = ZDOID.None; private Vector3 _lastPos; private float _stuckTimer = 0f; private bool _isSleeping = false; private bool _wasNight = false; private static readonly string[] _sleepPhrases = new string[8] { "Deu a minha hora, o peão tá cansado. Até amanhã!", "Chega por hoje, amanhã tem mais.", "Bati o ponto! Boa noite chefe.", "Indo deitar. Ninguém é de ferro, né?", "E chegou a hora de dormir, até amanhã!", "Acabou o expediente, patrão. Vou berçar.", "Vou capotar na cama agora. Boa noite!", "Sextou... ou não, mas eu vou dormir." }; private static readonly string[] _wakePhrases = new string[4] { "Bom dia! Bora trabalhar que a base não se constrói sozinha.", "O sol nasceu, hora de arregaçar as mangas!", "Mais um dia de labuta. Bom dia chefe!", "Acordei! Cadê as fornalhas pra encher?" }; private float _aliveTime = 0f; private static Dictionary _messageCooldowns = new Dictionary(); private bool _wasPaused = false; private GameObject _targetSmelter; private void Awake() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) _nview = ((Component)this).GetComponent(); _character = ((Component)this).GetComponent(); _monsterAI = ((Component)this).GetComponent(); _humanoid = ((Component)this).GetComponent(); if ((Object)(object)_character != (Object)null) { _character.m_faction = (Faction)0; } } private void Start() { if ((Object)(object)_monsterAI != (Object)null) { _monsterAI.m_alertRange = 0f; ((BaseAI)_monsterAI).m_viewRange = 0f; ((BaseAI)_monsterAI).m_hearRange = 0f; ((BaseAI)_monsterAI).m_afraidOfFire = false; ((BaseAI)_monsterAI).m_avoidFire = false; _monsterAI.m_fleeIfNotAlerted = false; } if ((Object)(object)_nview != (Object)null && _nview.IsOwner() && (Object)(object)_monsterAI != (Object)null) { ((BaseAI)_monsterAI).SetPatrolPoint(); ((BaseAI)_monsterAI).m_randomMoveRange = Plugin.WorkRadius.Value; ((BaseAI)_monsterAI).m_randomMoveInterval = 5f; } if ((Object)(object)_character != (Object)null) { Character character = _character; character.m_onDeath = (Action)Delegate.Combine(character.m_onDeath, new Action(OnNPCDied)); } } private void OnNPCDied() { //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_0045: 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_005a: 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) if (!((Object)(object)_nview != (Object)null) || !_nview.IsValid() || !_nview.IsOwner()) { return; } ZDOID zDOID = _nview.GetZDO().GetZDOID("TotemID"); if (zDOID != ZDOID.None) { ZDO zDO = ZDOMan.instance.GetZDO(zDOID); if (zDO != null) { Logger.LogInfo((object)"[AssistantAI] O NPC morreu, limpando a ZDO do Totem para permitir respawn..."); zDO.Set("NPC_ID", ZDOID.None); } } } private void Update() { //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Invalid comparison between Unknown and I4 //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Invalid comparison between Unknown and I4 //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Invalid comparison between Unknown and I4 //IL_037d: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: Unknown result type (might be due to invalid IL or missing references) //IL_03cc: Unknown result type (might be due to invalid IL or missing references) //IL_03d6: Unknown result type (might be due to invalid IL or missing references) //IL_0452: Unknown result type (might be due to invalid IL or missing references) //IL_0464: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_nview == (Object)null || !_nview.IsOwner()) { return; } _aliveTime += Time.deltaTime; if ((Object)(object)_character != (Object)null) { _character.m_walkSpeed = Plugin.NpcWalkSpeed.Value; _character.m_runSpeed = Plugin.NpcRunSpeed.Value; } if (!_weaponsCleared && (Object)(object)_humanoid != (Object)null && _humanoid.GetInventory() != null) { List list = new List(_humanoid.GetInventory().GetAllItems()); if (list.Count > 0) { foreach (ItemData item in list) { if ((int)item.m_shared.m_itemType == 4 || (int)item.m_shared.m_itemType == 3 || (int)item.m_shared.m_itemType == 14 || item.m_shared.m_name.ToLower().Contains("crossbow") || item.m_shared.m_name.ToLower().Contains("arbalest")) { _humanoid.UnequipItem(item, true); _humanoid.GetInventory().RemoveItem(item); } } _weaponsCleared = true; } } if (_greetCooldown > 0f) { _greetCooldown -= Time.deltaTime; } if (!_itemsHidden && (Object)(object)_humanoid != (Object)null) { _humanoid.HideHandItems(false, true); _itemsHidden = true; } if ((Object)(object)_character != (Object)null) { if (_heldItemData != null && _heldItemData.m_stack > 0) { string arg = Localization.instance.Localize(_heldItemData.m_shared.m_name); _character.m_name = $"Assistente ({_heldItemData.m_stack}x {arg})"; } else { string arg2 = (((Object)(object)_nview != (Object)null && _nview.GetZDO() != null) ? _nview.GetZDO().GetString("AssistantName", "Assistente da Base") : "Assistente da Base"); int num = (((Object)(object)_nview != (Object)null && _nview.GetZDO() != null) ? _nview.GetZDO().GetInt("AssistantProfession", 0) : 0); AssistantSpawner.Profession profession = (AssistantSpawner.Profession)num; _character.m_name = $"{arg2} [{profession}]"; } } if (_isSleeping && (Object)(object)_targetObj != (Object)null && _currentTask == "GoToSleep") { if ((Object)(object)_monsterAI != (Object)null) { ((Behaviour)_monsterAI).enabled = false; } if ((Object)(object)_character != (Object)null) { _character.SetMoveDir(Vector3.zero); Animator componentInChildren = ((Component)_character).GetComponentInChildren(); if ((Object)(object)componentInChildren != (Object)null) { ((Component)componentInChildren).transform.localRotation = Quaternion.Euler(-90f, 0f, 0f); ((Component)componentInChildren).transform.localPosition = Vector3.up * 0.5f; } } } else { if ((Object)(object)_monsterAI != (Object)null && !((Behaviour)_monsterAI).enabled) { ((Behaviour)_monsterAI).enabled = true; } if ((Object)(object)_character != (Object)null) { Animator componentInChildren2 = ((Component)_character).GetComponentInChildren(); if ((Object)(object)componentInChildren2 != (Object)null) { ((Component)componentInChildren2).transform.localRotation = Quaternion.identity; ((Component)componentInChildren2).transform.localPosition = Vector3.zero; } } } _timeSinceLastScan += Time.deltaTime; if (_timeSinceLastScan >= _scanInterval) { _timeSinceLastScan = 0f; CheckForPlayerGreeting(); ProcessAI(); } } private void SayMessage(string msgId, string text, float cooldownMinutes = 3f, bool force = false) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) Player closestPlayer = Player.GetClosestPlayer(((Component)this).transform.position, 15f); if ((Object)(object)closestPlayer == (Object)null || (!force && _messageCooldowns.ContainsKey(msgId) && Time.time < _messageCooldowns[msgId])) { return; } AssistantAI[] array = Object.FindObjectsOfType(); AssistantAI assistantAI = this; float num = Vector3.Distance(((Component)this).transform.position, ((Component)closestPlayer).transform.position); AssistantAI[] array2 = array; foreach (AssistantAI assistantAI2 in array2) { float num2 = Vector3.Distance(((Component)assistantAI2).transform.position, ((Component)closestPlayer).transform.position); if (num2 < num) { assistantAI = assistantAI2; num = num2; } } if (!((Object)(object)assistantAI != (Object)(object)this)) { Chat.instance.SetNpcText(((Component)this).gameObject, Vector3.up * 1.5f, 20f, 5f, "", text, false); _messageCooldowns[msgId] = Time.time + cooldownMinutes * 60f; } } private void CheckForPlayerGreeting() { //IL_001c: 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) if (_greetCooldown <= 0f) { Player closestPlayer = Player.GetClosestPlayer(((Component)this).transform.position, 10f); if ((Object)(object)closestPlayer != (Object)null) { ((Component)this).transform.LookAt(((Component)closestPlayer).transform.position); SayMessage("greet", "Olá " + closestPlayer.GetPlayerName() + ", trabalhando duro na base!", 5f); _greetCooldown = 60f; } } } private GameObject FindBed() { //IL_0036: 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_0062: 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_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_0355: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_027e: Unknown result type (might be due to invalid IL or missing references) //IL_0248: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0297: Unknown result type (might be due to invalid IL or missing references) //IL_02a1: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02ca: Unknown result type (might be due to invalid IL or missing references) ZNetView component = ((Component)this).GetComponent(); if ((Object)(object)component == (Object)null || !component.IsValid()) { return null; } ZDOID zDOID = component.GetZDO().GetZDOID("AssignedBed"); List list = new List(); Piece.GetAllPiecesInRadius(GetBaseCenter(), Plugin.WorkRadius.Value, list); GameObject val = null; float num = float.MaxValue; if (zDOID != ZDOID.None) { foreach (Piece item in list) { if (((Object)item).name.StartsWith("BaseAssistantBed") || item.m_name.Contains("Cama do Assistente") || ((Object)item).name.ToLower().Contains("bed")) { ZNetView component2 = ((Component)item).GetComponent(); if ((Object)(object)component2 != (Object)null && component2.IsValid() && component2.GetZDO().m_uid == zDOID) { return ((Component)item).gameObject; } } } component.GetZDO().Set("AssignedBed", ZDOID.None); zDOID = ZDOID.None; } foreach (Piece item2 in list) { if (!((Object)item2).name.StartsWith("BaseAssistantBed") && !item2.m_name.Contains("Cama do Assistente") && !((Object)item2).name.ToLower().Contains("bed")) { continue; } ZNetView component3 = ((Component)item2).GetComponent(); if ((Object)(object)component3 == (Object)null || !component3.IsValid()) { continue; } ZDOID uid = component3.GetZDO().m_uid; ZDOID val2 = component3.GetZDO().GetZDOID("AssignedNPC"); if (val2 != ZDOID.None && val2 != component.GetZDO().m_uid) { ZDO zDO = ZDOMan.instance.GetZDO(val2); if (zDO == null) { val2 = ZDOID.None; component3.GetZDO().Set("AssignedNPC", ZDOID.None); } } if ((val2 == ZDOID.None || val2 == component.GetZDO().m_uid) && (!ReservedItems.Contains(uid) || !(_reservedZDOID != uid))) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)item2).transform.position); if (num2 < num) { num = num2; val = ((Component)item2).gameObject; } } } if ((Object)(object)val != (Object)null) { ZNetView component4 = val.GetComponent(); component.GetZDO().Set("AssignedBed", component4.GetZDO().m_uid); component4.GetZDO().Set("AssignedNPC", component.GetZDO().m_uid); } return val; } private GameObject FindTotem() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0060: 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) List list = new List(); Piece.GetAllPiecesInRadius(GetBaseCenter(), 5f, list); GameObject result = null; float num = float.MaxValue; foreach (Piece item in list) { if (((Object)item).name.StartsWith("AssistantTotem") || (Object)(object)((Component)item).GetComponent() != (Object)null) { float num2 = Vector3.Distance(GetBaseCenter(), ((Component)item).transform.position); if (num2 < num) { num = num2; result = ((Component)item).gameObject; } } } return result; } private void ReleaseReservation() { //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_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_002d: Unknown result type (might be due to invalid IL or missing references) if (_reservedZDOID != ZDOID.None) { ReservedItems.Remove(_reservedZDOID); _reservedZDOID = ZDOID.None; } } private void ClearReservationWithoutRelease() { //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) _reservedZDOID = ZDOID.None; } private void SetTask(string task, GameObject target) { if (task != _currentTask) { ReleaseReservation(); } if (task != "GoToSleep") { _isSleeping = false; } _currentTask = task; _targetObj = target; _taskTimeout = 15f; _stuckTimer = 0f; if ((Object)(object)_monsterAI != (Object)null) { _monsterAI.SetFollowTarget(target); } } private void ProcessAI() { //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Unknown result type (might be due to invalid IL or missing references) //IL_02b1: 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_031d: Unknown result type (might be due to invalid IL or missing references) //IL_0322: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Unknown result type (might be due to invalid IL or missing references) //IL_0331: Unknown result type (might be due to invalid IL or missing references) //IL_02f3: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Unknown result type (might be due to invalid IL or missing references) //IL_0307: Unknown result type (might be due to invalid IL or missing references) //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_0365: Unknown result type (might be due to invalid IL or missing references) //IL_051a: Unknown result type (might be due to invalid IL or missing references) //IL_0520: Unknown result type (might be due to invalid IL or missing references) //IL_05f9: Unknown result type (might be due to invalid IL or missing references) //IL_05fe: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_nview != (Object)null && _nview.IsValid()) { bool flag = _nview.GetZDO().GetBool("AssistantPaused", false); if (flag) { if (!_wasPaused) { SayMessage("vacation_start", "Férias merecidas! Vou tirar um cochilo.", 5f, force: true); DropHoldingItem(); _wasPaused = true; GameObject val = FindBed(); if ((Object)(object)val != (Object)null) { SetTask("GoToSleep", val); } else { GameObject target = FindTotem(); SetTask("WaitByTotem", target); } } if (flag && _isSleeping) { return; } } else if (_wasPaused) { SayMessage("vacation_end", "Acabou a folga! Voltando ao trabalho.", 5f, force: true); SetTask("Idle", null); _isSleeping = false; _wasPaused = false; } } bool flag2 = (Object)(object)EnvMan.instance != (Object)null && EnvMan.IsNight(); if (flag2 && !_wasNight) { string text = _sleepPhrases[Random.Range(0, _sleepPhrases.Length)]; SayMessage("night_start", text, 10f, force: true); _wasNight = true; GameObject val2 = FindBed(); if ((Object)(object)val2 != (Object)null) { DropHoldingItem(); SetTask("GoToSleep", val2); ZNetView component = val2.GetComponent(); if ((Object)(object)component != (Object)null) { ZDOID uid = component.GetZDO().m_uid; ReservedItems.Add(uid); _reservedZDOID = uid; } } else { SayMessage("no_bed", "Trabalhei o dia todo e não me deram nem uma cama... Que exploração!", 10f, force: true); GameObject val3 = FindTotem(); if ((Object)(object)val3 != (Object)null) { DropHoldingItem(); SetTask("WaitByTotem", val3); } } } else if (!flag2 && _wasNight) { string text2 = _wakePhrases[Random.Range(0, _wakePhrases.Length)]; SayMessage("morning_start", text2, 10f, force: true); _wasNight = false; _isSleeping = false; SetTask("Idle", null); GameObject val4 = FindBed(); if ((Object)(object)val4 != (Object)null) { ((Component)this).transform.position = val4.transform.position + Vector3.up * 1.5f; } else { GameObject val5 = FindTotem(); if ((Object)(object)val5 != (Object)null) { ((Component)this).transform.position = val5.transform.position + Vector3.up * 1.5f; } else { ((Component)this).transform.position = GetBaseCenter() + Vector3.up * 1.5f; } } GameObject prefab = Cache.GetPrefab("vfx_sledge_hit"); if ((Object)(object)prefab != (Object)null) { Object.Instantiate(prefab, ((Component)this).transform.position, Quaternion.identity); } } if (_isSleeping && flag2) { return; } if (IsUnderAttack()) { if (_currentTask != "Panic") { SetTask("Panic", null); SayMessage("panic_start", "Socorro! Monstros na base!", 5f, force: true); } GameObject val6 = FindBed(); if ((Object)(object)val6 != (Object)null) { _monsterAI.SetFollowTarget(val6); return; } GameObject val7 = FindTotem(); if ((Object)(object)val7 != (Object)null) { _monsterAI.SetFollowTarget(val7); } else { _monsterAI.SetFollowTarget((GameObject)null); } return; } if (_currentTask == "Panic") { SetTask("Idle", null); SayMessage("panic_end", "Ufa, parece seguro agora...", 5f, force: true); } if (_isSleeping) { return; } if ((_wasNight || _wasPaused) && _currentTask == "Idle") { GameObject val8 = FindBed(); if ((Object)(object)val8 != (Object)null) { SetTask("GoToSleep", val8); return; } GameObject val9 = FindTotem(); if ((Object)(object)val9 != (Object)null) { SetTask("WaitByTotem", val9); } return; } if (_currentTask != "Idle") { if (Vector3.Distance(((Component)this).transform.position, _lastPos) < 0.5f) { _stuckTimer += _scanInterval; if (_stuckTimer >= Plugin.StuckTimeout.Value && (Object)(object)_targetObj != (Object)null) { Logger.LogInfo((object)("[AssistantAI] Preso indo para " + ((Object)_targetObj).name + ". Abandonando tarefa!")); float num = ((_currentTask == "PickupGround") ? 5f : 15f); _blacklistedObjects[_targetObj] = Time.time + num; SetTask("Idle", null); return; } } else { _stuckTimer = 0f; } _lastPos = ((Component)this).transform.position; _taskTimeout -= _scanInterval; if ((Object)(object)_targetObj == (Object)null || _taskTimeout <= 0f) { if ((Object)(object)_targetObj == (Object)null && _currentTask == "PickupGround") { ClearReservationWithoutRelease(); } Logger.LogWarning((object)("[AssistantAI] Tarefa " + _currentTask + " expirou ou alvo foi destruído. Voltando para Idle.")); SetTask("Idle", null); return; } } string currentTask = _currentTask; if (_currentTask == "Idle" && !_wasNight && !_wasPaused) { FindNewTask(); } else if (_currentTask == "PickupGround") { ExecutePickupGround(); } else if (_currentTask == "TakeFromInbox") { ExecuteTakeFromInbox(); } else if (_currentTask == "MoveToChestToStore") { ExecuteStoreToChest(); } else if (_currentTask == "MoveToChestToFetch") { ExecuteFetchForSmelting(); } else if (_currentTask == "MoveToChestToConsolidate") { ExecuteConsolidateFetch(); } else if (_currentTask == "FeedSmelter") { ExecuteFeedSmelter(); } else if (_currentTask == "RepairPiece") { ExecuteRepairPiece(); } else if (_currentTask == "GoToSleep") { ExecuteGoToSleep(); } else if (_currentTask == "WaitByTotem") { ExecuteWaitByTotem(); } if (currentTask != _currentTask) { Logger.LogInfo((object)("[AssistantAI] Mudou de tarefa: " + currentTask + " -> " + _currentTask)); } } private Vector3 GetBaseCenter() { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_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_003f: 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_0041: 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) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_nview != (Object)null && _nview.GetZDO() != null) { Vector3 vec = _nview.GetZDO().GetVec3("HomeBedPos", Vector3.zero); if (vec != Vector3.zero) { return vec; } } return ((Component)this).transform.position; } private bool CheckAndSetSmeltingTask(Collider[] hits) { //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_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_0518: Unknown result type (might be due to invalid IL or missing references) //IL_0521: Unknown result type (might be due to invalid IL or missing references) //IL_0523: Unknown result type (might be due to invalid IL or missing references) Dictionary dictionary = new Dictionary(); foreach (Collider val in hits) { Smelter componentInParent = ((Component)val).GetComponentInParent(); if (!((Object)(object)componentInParent != (Object)null) || (_blacklistedObjects.ContainsKey(((Component)componentInParent).gameObject) && Time.time < _blacklistedObjects[((Component)componentInParent).gameObject])) { continue; } ZNetView component = ((Component)componentInParent).GetComponent(); if ((Object)(object)component == (Object)null || !component.IsValid()) { continue; } ZDOID uid = component.GetZDO().m_uid; if (ReservedItems.Contains(uid) && _reservedZDOID != uid) { continue; } if (componentInParent.m_maxFuel > 0 && (Object)(object)componentInParent.m_fuelItem != (Object)null) { float num = component.GetZDO().GetFloat("fuel", 0f); if (num < (float)componentInParent.m_maxFuel) { string name = componentInParent.m_fuelItem.m_itemData.m_shared.m_name; int leaveAmount = (name.ToLower().Contains("coal") ? Plugin.LeaveCoalAmount.Value : Plugin.LeaveWoodAmount.Value); Container val2 = FindChestForSmelterItem(hits, name, leaveAmount); if ((Object)(object)val2 != (Object)null) { _heldItemData = componentInParent.m_fuelItem.m_itemData.Clone(); _heldItemData.m_dropPrefab = ((Component)componentInParent.m_fuelItem).gameObject; _heldItemData.m_stack = 0; _targetSmelter = ((Component)componentInParent).gameObject; SetTask("MoveToChestToFetch", ((Component)val2).gameObject); ReservedItems.Add(uid); _reservedZDOID = uid; return true; } string text = (name.ToLower().Contains("coal") ? "Carvão" : "Madeira para queimar"); SayMessage("no_fuel_" + name, "Atenção chefe! Falta " + text + " nos baús!", 5f); } } int num2 = component.GetZDO().GetInt("queued", 0); if (num2 >= componentInParent.m_maxOre || componentInParent.m_conversion == null) { continue; } foreach (ItemConversion item in componentInParent.m_conversion) { if ((Object)(object)item.m_from == (Object)null || (Object)(object)item.m_to == (Object)null) { continue; } string name2 = item.m_from.m_itemData.m_shared.m_name; string name3 = item.m_to.m_itemData.m_shared.m_name; if (name3.ToLower().Contains("coal")) { string text2 = name2.ToLower(); if (text2.Contains("finewood") || text2.Contains("roundlog") || text2.Contains("elderbark") || text2.Contains("yggdrasil")) { continue; } if (!dictionary.ContainsKey(name3)) { dictionary[name3] = CountItemInBase(name3, hits); } if (dictionary[name3] >= Plugin.MaxCoalAmount.Value) { continue; } } int value = Plugin.LeaveOreAmount.Value; string text3 = name2.ToLower(); if (text3.Contains("wood")) { value = Plugin.LeaveWoodAmount.Value; } else if (text3.Contains("copper")) { value = Plugin.LeaveCopperOre.Value; } else if (text3.Contains("tin")) { value = Plugin.LeaveTinOre.Value; } else if (text3.Contains("iron")) { value = Plugin.LeaveIronOre.Value; } else if (text3.Contains("silver")) { value = Plugin.LeaveSilverOre.Value; } else if (text3.Contains("blackmetal")) { value = Plugin.LeaveBlackMetalScrap.Value; } else if (text3.Contains("flametal")) { value = Plugin.LeaveFlametalOre.Value; } Container val3 = FindChestForSmelterItem(hits, name2, value); if ((Object)(object)val3 != (Object)null) { _heldItemData = item.m_from.m_itemData.Clone(); _heldItemData.m_dropPrefab = ((Component)item.m_from).gameObject; _heldItemData.m_stack = 0; _targetSmelter = ((Component)componentInParent).gameObject; SetTask("MoveToChestToFetch", ((Component)val3).gameObject); ReservedItems.Add(uid); _reservedZDOID = uid; return true; } if (!name3.ToLower().Contains("coal")) { string text4 = Localization.instance.Localize(item.m_to.m_itemData.m_shared.m_name); SayMessage("no_ore_" + name2, "Chefe, a reserva de minério secou! Sem material para " + text4 + "!", 10f); } } } return false; } private Container FindChestForSmelterItem(Collider[] hits, string targetItemName, int leaveAmount) { foreach (Collider val in hits) { Container componentInParent = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && componentInParent.GetInventory() != null && (!_blacklistedObjects.ContainsKey(((Component)componentInParent).gameObject) || !(Time.time < _blacklistedObjects[((Component)componentInParent).gameObject]))) { int num = componentInParent.GetInventory().CountItems(targetItemName, -1, true); if (num > leaveAmount) { return componentInParent; } } } return null; } private void ExecuteWaitByTotem() { //IL_0028: 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_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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_targetObj == (Object)null) { _currentTask = "Idle"; return; } float num = Vector2.Distance(new Vector2(((Component)this).transform.position.x, ((Component)this).transform.position.z), new Vector2(_targetObj.transform.position.x, _targetObj.transform.position.z)); if (num < 2.5f) { _monsterAI.SetFollowTarget((GameObject)null); if ((Object)(object)_character != (Object)null) { _character.SetMoveDir(Vector3.zero); } ((Component)this).transform.LookAt(new Vector3(_targetObj.transform.position.x, ((Component)this).transform.position.y, _targetObj.transform.position.z)); } else { _monsterAI.SetFollowTarget(_targetObj); } } private void ExecuteGoToSleep() { //IL_0028: 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_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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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_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_00d3: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_targetObj == (Object)null) { _currentTask = "Idle"; return; } float num = Vector2.Distance(new Vector2(((Component)this).transform.position.x, ((Component)this).transform.position.z), new Vector2(_targetObj.transform.position.x, _targetObj.transform.position.z)); if (num < 3.5f) { _isSleeping = true; ((Component)this).transform.position = _targetObj.transform.position + Vector3.up * 0.8f; _monsterAI.SetFollowTarget((GameObject)null); _character.SetMoveDir(Vector3.zero); } else { _monsterAI.SetFollowTarget(_targetObj); } } private void ExecuteRepairPiece() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: 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) if ((Object)(object)_targetObj == (Object)null) { _currentTask = "Idle"; return; } float value = Plugin.RepairDistance.Value; if (IsCloseEnough(_targetObj, value, value)) { Collider[] array = Physics.OverlapSphere(_targetObj.transform.position, Plugin.AoERepairRadius.Value); bool flag = false; Collider[] array2 = array; foreach (Collider val in array2) { Piece componentInParent = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null) { WearNTear component = ((Component)componentInParent).GetComponent(); if ((Object)(object)component != (Object)null && component.GetHealthPercentage() < 1f) { component.Repair(); componentInParent.m_placeEffect.Create(((Component)componentInParent).transform.position, ((Component)componentInParent).transform.rotation, (Transform)null, 1f, -1); flag = true; } } } if (flag) { ((Component)this).transform.LookAt(_targetObj.transform.position); ZSyncAnimation component2 = ((Component)this).GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.SetTrigger("interact"); } } _currentTask = "Idle"; _monsterAI.SetFollowTarget((GameObject)null); } else { _monsterAI.SetFollowTarget(_targetObj); } } private int CountItemInBase(string prefabName, Collider[] hits) { GameObject prefab = Cache.GetPrefab(prefabName); if ((Object)(object)prefab == (Object)null) { return 0; } string name = prefab.GetComponent().m_itemData.m_shared.m_name; int num = 0; foreach (Collider val in hits) { Container componentInParent = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && componentInParent.GetInventory() != null && !((Object)componentInParent).name.Contains("personal")) { num += componentInParent.GetInventory().CountItems(name, -1, true); continue; } ItemDrop componentInParent2 = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent2 != (Object)null && componentInParent2.m_itemData != null && componentInParent2.m_itemData.m_shared.m_name == name) { num += componentInParent2.m_itemData.m_stack; continue; } AssistantAI componentInParent3 = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent3 != (Object)null && componentInParent3._heldItemData != null && componentInParent3._heldItemData.m_shared.m_name == name) { num += componentInParent3._heldItemData.m_stack; } } return num; } private void FindNewTask() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_05c0: Unknown result type (might be due to invalid IL or missing references) //IL_05c5: Unknown result type (might be due to invalid IL or missing references) //IL_05cc: Unknown result type (might be due to invalid IL or missing references) //IL_047d: Unknown result type (might be due to invalid IL or missing references) //IL_0482: Unknown result type (might be due to invalid IL or missing references) //IL_0489: Unknown result type (might be due to invalid IL or missing references) //IL_0493: Unknown result type (might be due to invalid IL or missing references) //IL_0498: Unknown result type (might be due to invalid IL or missing references) //IL_04cd: Unknown result type (might be due to invalid IL or missing references) //IL_04d6: Unknown result type (might be due to invalid IL or missing references) //IL_04d8: Unknown result type (might be due to invalid IL or missing references) //IL_0669: Unknown result type (might be due to invalid IL or missing references) //IL_0672: Unknown result type (might be due to invalid IL or missing references) //IL_0674: Unknown result type (might be due to invalid IL or missing references) if (((Object)(object)_nview != (Object)null && !_nview.IsOwner()) || _currentTask != "Idle") { return; } Collider[] array = Physics.OverlapSphere(GetBaseCenter(), Plugin.WorkRadius.Value); if (_heldItemData != null && _heldItemData.m_stack > 0) { GameObject dropPrefab = _heldItemData.m_dropPrefab; int num = 50; if ((Object)(object)dropPrefab != (Object)null) { num = dropPrefab.GetComponent().m_itemData.m_shared.m_maxStackSize; } if (_heldItemData.m_stack < num) { Collider[] array2 = array; foreach (Collider val in array2) { ItemDrop componentInParent = ((Component)val).GetComponentInParent(); if (!((Object)(object)componentInParent != (Object)null) || !((Object)(object)((Component)componentInParent).GetComponent() != (Object)null) || !((Component)componentInParent).GetComponent().IsValid()) { continue; } ZDOID uid = ((Component)componentInParent).GetComponent().GetZDO().m_uid; if (!ReservedItems.Contains(uid) && (!_blacklistedObjects.ContainsKey(((Component)componentInParent).gameObject) || !(Time.time < _blacklistedObjects[((Component)componentInParent).gameObject]))) { string text = ((Object)((Component)componentInParent).gameObject).name.Replace("(Clone)", "").Trim(); if ((Object)(object)dropPrefab != (Object)null && text == ((Object)dropPrefab).name) { SetTask("PickupGround", ((Component)componentInParent).gameObject); ReservedItems.Add(uid); _reservedZDOID = uid; return; } } } } Container val2 = FindChestFor(_heldItemData, array); if ((Object)(object)val2 != (Object)null) { SetTask("MoveToChestToStore", ((Component)val2).gameObject); return; } Logger.LogWarning((object)("[AssistantAI] Não achei baú com espaço para " + ((Object)_heldItemData.m_dropPrefab).name + ". Dropando no chão.")); DropHoldingItem(); return; } for (int j = 1; j <= 2; j++) { bool flag = j == 1 && _lastTaskCategory == "Sorting"; bool flag2 = j == 1 && _lastTaskCategory == "Repair"; bool flag3 = j == 1 && _lastTaskCategory == "Smelting"; bool flag4 = j == 1 && _lastTaskCategory == "Looting"; AssistantSpawner.Profession profession = AssistantSpawner.Profession.Geral; if ((Object)(object)_nview != (Object)null && _nview.IsValid()) { profession = (AssistantSpawner.Profession)_nview.GetZDO().GetInt("AssistantProfession", 0); } if (!flag && Plugin.EnableSorting.Value && (profession == AssistantSpawner.Profession.Geral || profession == AssistantSpawner.Profession.Organizador)) { Container val3 = FindInboxChestWithValidItems(); if ((Object)(object)val3 != (Object)null) { _lastTaskCategory = "Sorting"; _currentTask = "TakeFromInbox"; _targetObj = ((Component)val3).gameObject; _monsterAI.SetFollowTarget(_targetObj); return; } } if (!flag2 && Plugin.EnableRepairing.Value && (profession == AssistantSpawner.Profession.Geral || profession == AssistantSpawner.Profession.Reparador)) { Collider[] array3 = array; foreach (Collider val4 in array3) { Piece componentInParent2 = ((Component)val4).GetComponentInParent(); if (!((Object)(object)componentInParent2 != (Object)null) || (_blacklistedObjects.ContainsKey(((Component)componentInParent2).gameObject) && Time.time < _blacklistedObjects[((Component)componentInParent2).gameObject])) { continue; } WearNTear component = ((Component)componentInParent2).GetComponent(); if (!((Object)(object)component != (Object)null) || !(component.GetHealthPercentage() < Plugin.RepairHealthThreshold.Value)) { continue; } ZNetView component2 = ((Component)componentInParent2).GetComponent(); if ((Object)(object)component2 != (Object)null && component2.IsValid()) { ZDOID uid2 = component2.GetZDO().m_uid; if (!ReservedItems.Contains(uid2) || !(_reservedZDOID != uid2)) { _lastTaskCategory = "Repair"; SetTask("RepairPiece", ((Component)componentInParent2).gameObject); ReservedItems.Add(uid2); _reservedZDOID = uid2; return; } } } } if (!flag3 && Plugin.EnableSmelting.Value && (profession == AssistantSpawner.Profession.Geral || profession == AssistantSpawner.Profession.Ferreiro) && CheckAndSetSmeltingTask(array)) { _lastTaskCategory = "Smelting"; return; } if (!flag4 && Plugin.EnableLooting.Value && (profession == AssistantSpawner.Profession.Geral || profession == AssistantSpawner.Profession.Organizador)) { Collider[] array4 = array; foreach (Collider val5 in array4) { ItemDrop componentInParent3 = ((Component)val5).GetComponentInParent(); if (!((Object)(object)componentInParent3 != (Object)null) || !((Object)(object)((Component)componentInParent3).GetComponent() != (Object)null) || !((Component)componentInParent3).GetComponent().IsValid()) { continue; } ZDOID uid3 = ((Component)componentInParent3).GetComponent().GetZDO().m_uid; if (!ReservedItems.Contains(uid3) && (!_blacklistedObjects.ContainsKey(((Component)componentInParent3).gameObject) || !(Time.time < _blacklistedObjects[((Component)componentInParent3).gameObject])) && componentInParent3.m_itemData != null) { Container val6 = FindChestFor(componentInParent3.m_itemData, array); if ((Object)(object)val6 != (Object)null) { _lastTaskCategory = "Looting"; SetTask("PickupGround", ((Component)componentInParent3).gameObject); ReservedItems.Add(uid3); _reservedZDOID = uid3; return; } } } } if (!flag && Plugin.EnableSorting.Value && CheckAndSetConsolidationTask(array)) { _lastTaskCategory = "Sorting"; return; } } _lastTaskCategory = ""; SayMessage("all_done", "Base 100% limpa e organizada. Pausa para o hidromel!", 60f); } private Container FindChestFor(ItemData targetItem, Collider[] hits) { if (targetItem == null || targetItem.m_shared == null) { return null; } Container val = null; int num = -1; foreach (Collider val2 in hits) { Container componentInParent = ((Component)val2).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && componentInParent.GetInventory() != null && !((Object)componentInParent).name.Contains("personal") && (!_blacklistedObjects.ContainsKey(((Component)componentInParent).gameObject) || !(Time.time < _blacklistedObjects[((Component)componentInParent).gameObject])) && componentInParent.GetInventory().CanAddItem(targetItem, -1)) { string customName = ""; ZNetView component = ((Component)componentInParent).GetComponent(); if ((Object)(object)component != (Object)null && component.IsValid() && component.GetZDO() != null) { customName = component.GetZDO().GetString("text", "").ToLower() .Trim(); } int chestScore = GetChestScore(componentInParent, targetItem, customName); if (chestScore > num) { num = chestScore; val = componentInParent; } } } return (num >= 0) ? val : null; } private int GetChestScore(Container container, ItemData targetItem, string customName) { //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_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Invalid comparison between Unknown and I4 //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) string text = targetItem.m_shared.m_name ?? ""; string text2 = text.ToLower(); ItemType itemType = targetItem.m_shared.m_itemType; if (!string.IsNullOrEmpty(customName)) { if (MatchAny(customName, Plugin.TagIgnore.Value.ToLower().Split(new char[1] { ',' }))) { return -1000; } string text3 = Localization.instance.Localize(text).ToLower().Trim(); if (customName == text3) { return 2000; } if (customName == text2.Replace("$item_", "")) { return 2000; } bool flag = false; if (MatchAny(customName, Plugin.TagWeapons.Value.ToLower().Split(new char[1] { ',' })) && IsWeapon(itemType)) { flag = true; } if (MatchAny(customName, Plugin.TagArmor.Value.ToLower().Split(new char[1] { ',' })) && IsArmor(itemType)) { flag = true; } if (MatchAny(customName, Plugin.TagFood.Value.ToLower().Split(new char[1] { ',' })) && (int)itemType == 2) { flag = true; } if (MatchAny(customName, Plugin.TagWood.Value.ToLower().Split(new char[1] { ',' })) && IsWood(text2, itemType)) { flag = true; } if (MatchAny(customName, Plugin.TagMetal.Value.ToLower().Split(new char[1] { ',' })) && IsMetal(text2, itemType)) { flag = true; } return flag ? 1000 : (-1000); } if (container.GetInventory().NrOfItems() == 0) { return 0; } bool flag2 = false; bool flag3 = false; foreach (ItemData allItem in container.GetInventory().GetAllItems()) { if (allItem != null && allItem.m_shared != null) { string text4 = allItem.m_shared.m_name?.ToLower() ?? ""; if (text4 == text2) { flag3 = true; } else { flag2 = true; } } } if (flag2) { return -1000; } if (flag3) { return 100; } return -1000; } private bool CheckAndSetConsolidationTask(Collider[] hits) { foreach (Collider val in hits) { Container componentInParent = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent == (Object)null || componentInParent.GetInventory() == null || ((Object)componentInParent).name.Contains("personal") || (_blacklistedObjects.ContainsKey(((Component)componentInParent).gameObject) && Time.time < _blacklistedObjects[((Component)componentInParent).gameObject])) { continue; } string customName = ""; ZNetView component = ((Component)componentInParent).GetComponent(); if ((Object)(object)component != (Object)null && component.IsValid() && component.GetZDO() != null) { customName = component.GetZDO().GetString("text", "").ToLower() .Trim(); } foreach (ItemData allItem in componentInParent.GetInventory().GetAllItems()) { if (allItem == null || allItem.m_shared == null || (Object)(object)allItem.m_dropPrefab == (Object)null) { continue; } int chestScore = GetChestScore(componentInParent, allItem, customName); if (chestScore >= 2000) { continue; } Container val2 = FindChestFor(allItem, hits); if ((Object)(object)val2 != (Object)null && (Object)(object)val2 != (Object)(object)componentInParent) { string customName2 = ""; ZNetView component2 = ((Component)val2).GetComponent(); if ((Object)(object)component2 != (Object)null && component2.IsValid() && component2.GetZDO() != null) { customName2 = component2.GetZDO().GetString("text", "").ToLower() .Trim(); } int chestScore2 = GetChestScore(val2, allItem, customName2); if (chestScore2 >= 1000 && chestScore2 > chestScore) { _heldItemData = allItem.Clone(); _heldItemData.m_stack = 0; SetTask("MoveToChestToConsolidate", ((Component)componentInParent).gameObject); return true; } } } } return false; } private bool MatchAny(string text, string[] tags) { foreach (string text2 in tags) { if (text2.Trim() != "" && text.Contains(text2.Trim())) { return true; } } return false; } private bool IsWeapon(ItemType t) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Invalid comparison between Unknown and I4 return (int)t == 3 || (int)t == 14 || (int)t == 4 || (int)t == 19; } private bool IsArmor(ItemType t) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between Unknown and I4 //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Invalid comparison between Unknown and I4 //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 return (int)t == 5 || (int)t == 6 || (int)t == 7 || (int)t == 11 || (int)t == 17; } private bool IsWood(string name, ItemType type) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 if ((int)type != 1) { return false; } return name.Contains("wood") || name.Contains("log") || name.Contains("bark") || name.Contains("madeira") || name.Contains("lenha"); } private bool IsMetal(string name, ItemType type) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 if ((int)type != 1) { return false; } return name.Contains("ore") || name.Contains("scrap") || name.Contains("copper") || name.Contains("iron") || name.Contains("silver") || name.Contains("tin") || name.Contains("bronze") || name.Contains("metal") || name.Contains("flametal"); } private Container FindChestForWood(Collider[] hits, out string foundWoodType) { foundWoodType = "Wood"; GameObject prefab = Cache.GetPrefab("Wood"); if ((Object)(object)prefab == (Object)null) { return null; } string name = prefab.GetComponent().m_itemData.m_shared.m_name; foreach (Collider val in hits) { Container componentInParent = ((Component)val).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && componentInParent.GetInventory() != null && !((Object)componentInParent).name.Contains("personal") && (!_blacklistedObjects.ContainsKey(((Component)componentInParent).gameObject) || !(Time.time < _blacklistedObjects[((Component)componentInParent).gameObject])) && componentInParent.GetInventory().CountItems(name, -1, true) > 0) { return componentInParent; } } foundWoodType = ""; return null; } private bool IsCloseEnough(GameObject target, float maxDistXZ = 1.5f, float maxDistY = 2f) { //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //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_0072: 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) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0093: 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_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: 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_00dc: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)target == (Object)null) { return false; } maxDistXZ += 3.5f; maxDistY += 3.5f; Collider[] componentsInChildren = target.GetComponentsInChildren(); if (componentsInChildren.Length != 0) { float num = float.MaxValue; float num2 = float.MaxValue; Collider[] array = componentsInChildren; foreach (Collider val in array) { if (!val.isTrigger) { Bounds bounds = val.bounds; Vector3 val2 = ((Bounds)(ref bounds)).ClosestPoint(((Component)this).transform.position); float num3 = Vector2.Distance(new Vector2(((Component)this).transform.position.x, ((Component)this).transform.position.z), new Vector2(val2.x, val2.z)); float num4 = Mathf.Abs(((Component)this).transform.position.y - val2.y); if (num3 < num) { num = num3; } if (num4 < num2) { num2 = num4; } } } if (num != float.MaxValue) { Logger.LogInfo((object)$"[AssistantAI] Alvo: {((Object)target).name} | Dist Atual -> XZ: {num:F2} / Y: {num2:F2} | Config -> XZ: {maxDistXZ:F2} / Y: {maxDistY:F2}"); return num < maxDistXZ && num2 < maxDistY; } } float num5 = Vector2.Distance(new Vector2(((Component)this).transform.position.x, ((Component)this).transform.position.z), new Vector2(target.transform.position.x, target.transform.position.z)); float num6 = Mathf.Abs(((Component)this).transform.position.y - target.transform.position.y); Logger.LogInfo((object)$"[AssistantAI] Alvo (Sem Colisão): {((Object)target).name} | Dist Atual -> XZ: {num5:F2} / Y: {num6:F2} | Config -> XZ: {maxDistXZ + 2f:F2} / Y: {maxDistY + 0.5f:F2}"); return num5 < maxDistXZ + 2f && num6 < maxDistY + 0.5f; } private void ExecutePickupGround() { float value = Plugin.GroundItemDistance.Value; if (IsCloseEnough(_targetObj, value, value)) { ItemDrop component = _targetObj.GetComponent(); if (!((Object)(object)component != (Object)null) || component.m_itemData == null) { return; } if (_heldItemData == null) { _heldItemData = component.m_itemData.Clone(); } else if (((Object)_heldItemData.m_dropPrefab).name == ((Object)component.m_itemData.m_dropPrefab).name) { ItemData heldItemData = _heldItemData; heldItemData.m_stack += component.m_itemData.m_stack; } ZSyncAnimation component2 = ((Component)this).GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.SetTrigger("interact"); } ZNetView component3 = ((Component)component).GetComponent(); if ((Object)(object)component3 != (Object)null) { if (!component3.IsOwner()) { component3.GetZDO().SetOwner(ZDOMan.GetSessionID()); } component3.Destroy(); } else { Object.Destroy((Object)(object)((Component)component).gameObject); } ClearReservationWithoutRelease(); SetTask("Idle", null); } else { _monsterAI.SetFollowTarget(_targetObj); } } private void ExecuteStoreToChest() { //IL_0462: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_0233: 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_02a4: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Unknown result type (might be due to invalid IL or missing references) float value = Plugin.ChestDistance.Value; if (IsCloseEnough(_targetObj, value, value)) { Container component = _targetObj.GetComponent(); if ((Object)(object)component != (Object)null && component.GetInventory() != null && _heldItemData != null) { int stack = _heldItemData.m_stack; bool flag = component.GetInventory().NrOfItems() == 0; string name = _heldItemData.m_shared.m_name; string text = Localization.instance.Localize(name).Trim(); if (!string.IsNullOrEmpty(text)) { text = char.ToUpper(text[0]) + text.Substring(1); } ((Component)component).GetComponent().ClaimOwnership(); while (_heldItemData.m_stack > 0) { ItemData val = _heldItemData.Clone(); val.m_stack = 1; if (component.GetInventory().CanAddItem(val, -1)) { component.GetInventory().AddItem(val); ItemData heldItemData = _heldItemData; heldItemData.m_stack--; continue; } break; } if (stack != _heldItemData.m_stack) { if (flag && Plugin.EnableAutoLabeling.Value) { ZNetView component2 = ((Component)component).GetComponent(); if ((Object)(object)component2 != (Object)null && component2.IsValid()) { component2.GetZDO().Set("text", text); Logger.LogInfo((object)("[AssistantAI] Auto-Labeling: Baú batizado como '" + text + "'")); string text2 = name.ToLower(); if (IsWood(text2, _heldItemData.m_shared.m_itemType) || IsMetal(text2, _heldItemData.m_shared.m_itemType) || text2.Contains("stone") || text2.Contains("coal")) { Collider[] array = Physics.OverlapSphere(((Component)component).transform.position, 2.5f); Collider[] array2 = array; foreach (Collider val2 in array2) { Container componentInParent = ((Component)val2).GetComponentInParent(); if (!((Object)(object)componentInParent != (Object)null) || !((Object)(object)componentInParent != (Object)(object)component) || componentInParent.GetInventory() == null) { continue; } float num = Mathf.Abs(((Component)componentInParent).transform.position.x - ((Component)component).transform.position.x); float num2 = Mathf.Abs(((Component)componentInParent).transform.position.z - ((Component)component).transform.position.z); if (!(num < 0.5f) || !(num2 < 0.5f) || componentInParent.GetInventory().NrOfItems() != 0) { continue; } ZNetView component3 = ((Component)componentInParent).GetComponent(); if ((Object)(object)component3 != (Object)null && component3.IsValid()) { string value2 = component3.GetZDO().GetString("text", ""); if (string.IsNullOrEmpty(value2)) { component3.ClaimOwnership(); component3.GetZDO().Set("text", text); } } } } } } ZSyncAnimation component4 = ((Component)this).GetComponent(); if ((Object)(object)component4 != (Object)null) { component4.SetTrigger("interact"); } component.SetInUse(true); ((MonoBehaviour)this).StartCoroutine(CloseChest(component)); } if (_heldItemData.m_stack == 0) { _heldItemData = null; SetTask("Idle", null); } else { Logger.LogInfo((object)$"[AssistantAI] O baú encheu, sobrou {_heldItemData.m_stack} {((Object)_heldItemData.m_dropPrefab).name} na mão."); _blacklistedObjects[((Component)component).gameObject] = Time.time + 120f; SetTask("Idle", null); } ((Component)this).transform.LookAt(((Component)component).transform.position); } else { DropHoldingItem(); } } else { _monsterAI.SetFollowTarget(_targetObj); } } private IEnumerator CloseChest(Container chest) { yield return (object)new WaitForSeconds(1.5f); if ((Object)(object)chest != (Object)null) { chest.SetInUse(false); } } private void DropHoldingItem() { //IL_003a: 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_004f: 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_0059: 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_0068: 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) if (_heldItemData != null && _heldItemData.m_stack > 0) { ItemDrop.DropItem(_heldItemData, _heldItemData.m_stack, ((Component)this).transform.position + ((Component)this).transform.forward * 1f + Vector3.up * 0.5f, Quaternion.identity); _heldItemData = null; SetTask("Idle", null); } } private void ExecuteConsolidateFetch() { float value = Plugin.ChestDistance.Value; if (IsCloseEnough(_targetObj, value, value)) { Container component = _targetObj.GetComponent(); if ((Object)(object)component != (Object)null && component.GetInventory() != null && _heldItemData != null) { string name = _heldItemData.m_shared.m_name; int num = component.GetInventory().CountItems(name, -1, true); if (num > 0) { int num2 = Mathf.Min(_heldItemData.m_shared.m_maxStackSize, num); ((Component)component).GetComponent().ClaimOwnership(); component.GetInventory().RemoveItem(name, num2, -1, true); component.SetInUse(true); ((MonoBehaviour)this).StartCoroutine(CloseChest(component)); _heldItemData.m_stack = num2; Logger.LogInfo((object)$"[AssistantAI] Saquei {_heldItemData.m_stack} {((Object)_heldItemData.m_dropPrefab).name} para organizar/descontaminar."); } } SetTask("Idle", null); } else { _monsterAI.SetFollowTarget(_targetObj); } } private void ExecuteFetchForSmelting() { float value = Plugin.ChestDistance.Value; if (IsCloseEnough(_targetObj, value, value)) { Container component = _targetObj.GetComponent(); if ((Object)(object)component != (Object)null && component.GetInventory() != null && _heldItemData != null) { string name = _heldItemData.m_shared.m_name; int num = component.GetInventory().CountItems(name, -1, true); int num2 = (name.ToLower().Contains("wood") ? Plugin.LeaveWoodAmount.Value : (name.ToLower().Contains("coal") ? Plugin.LeaveCoalAmount.Value : Plugin.LeaveOreAmount.Value)); if (num > num2) { int num3 = Mathf.Min(_heldItemData.m_shared.m_maxStackSize, num - num2); ((Component)component).GetComponent().ClaimOwnership(); component.GetInventory().RemoveItem(name, num3, -1, true); component.SetInUse(true); ((MonoBehaviour)this).StartCoroutine(CloseChest(component)); ZSyncAnimation component2 = ((Component)this).GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.SetTrigger("interact"); } _heldItemData.m_stack = num3; if ((Object)(object)_targetSmelter != (Object)null) { SetTask("FeedSmelter", _targetSmelter); return; } } } SetTask("Idle", null); } else { _monsterAI.SetFollowTarget(_targetObj); } } private void ExecuteFeedSmelter() { float value = Plugin.KilnDistance.Value; if (IsCloseEnough(_targetObj, value, value)) { Smelter component = _targetObj.GetComponent(); if (!((Object)(object)component != (Object)null) || _heldItemData == null) { return; } ZNetView component2 = ((Component)component).GetComponent(); bool flag = (Object)(object)component.m_fuelItem != (Object)null && component.m_fuelItem.m_itemData.m_shared.m_name == _heldItemData.m_shared.m_name; string text = (((Object)(object)_heldItemData.m_dropPrefab != (Object)null) ? ((Object)_heldItemData.m_dropPrefab).name : _heldItemData.m_shared.m_name); Logger.LogWarning((object)$"[AssistantAI] ExecuteFeedSmelter. isFuel={flag}, prefabName={text}, IsOwner={component2.IsOwner()}"); if (flag) { float num = component2.GetZDO().GetFloat("fuel", 0f); int num2 = Mathf.FloorToInt((float)component.m_maxFuel - num); int num3 = Mathf.Min(num2, _heldItemData.m_stack); Logger.LogWarning((object)$"[AssistantAI] Feed FUEL: current={num}, space={num2}, amountToFeed={num3}"); if (num3 > 0) { for (int i = 0; i < num3; i++) { component2.InvokeRPC("AddFuel", Array.Empty()); } ZSyncAnimation component3 = ((Component)this).GetComponent(); if ((Object)(object)component3 != (Object)null) { component3.SetTrigger("interact"); } ItemData heldItemData = _heldItemData; heldItemData.m_stack -= num3; if (_heldItemData.m_stack <= 0) { _heldItemData = null; SetTask("Idle", null); } else { TryFeedNextSmelterOrDrop(); } return; } } else { int num4 = component2.GetZDO().GetInt("queued", 0); int num5 = component.m_maxOre - num4; int num6 = Mathf.Min(num5, _heldItemData.m_stack); bool flag2 = false; if (component.m_conversion != null) { foreach (ItemConversion item in component.m_conversion) { if ((Object)(object)item.m_from != (Object)null && ((Object)((Component)item.m_from).gameObject).name == text) { flag2 = true; break; } } } Logger.LogWarning((object)$"[AssistantAI] Feed ORE: queued={num4}, space={num5}, amountToFeed={num6}, isAllowed={flag2}"); if (num6 > 0) { if (!flag2) { Logger.LogWarning((object)("[AssistantAI] ERROR: Smelter " + ((Object)component).name + " DOES NOT ALLOW item " + text + "!")); DropHoldingItem(); SetTask("Idle", null); return; } for (int j = 0; j < num6; j++) { component2.InvokeRPC("AddOre", new object[1] { text }); } ZSyncAnimation component4 = ((Component)this).GetComponent(); if ((Object)(object)component4 != (Object)null) { component4.SetTrigger("interact"); } int num7 = component2.GetZDO().GetInt("queued", 0); Logger.LogWarning((object)$"[AssistantAI] Queued BEFORE: {num4}, AFTER ZDO: {num7}"); ItemData heldItemData2 = _heldItemData; heldItemData2.m_stack -= num6; if (_heldItemData.m_stack <= 0) { _heldItemData = null; SetTask("Idle", null); } else { TryFeedNextSmelterOrDrop(); } return; } } if ((Object)(object)_targetObj != (Object)null) { _blacklistedObjects[_targetObj] = Time.time + 60f; } TryFeedNextSmelterOrDrop(); } else { _monsterAI.SetFollowTarget(_targetObj); } } private void TryFeedNextSmelterOrDrop() { //IL_0048: 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_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_0062: Unknown result type (might be due to invalid IL or missing references) if (_heldItemData == null || _heldItemData.m_stack <= 0) { SetTask("Idle", null); return; } GameObject val = FindNextSmelterForHeldItem(); if ((Object)(object)val != (Object)null) { if (_reservedZDOID != ZDOID.None) { ReservedItems.Remove(_reservedZDOID); } _targetSmelter = val; _reservedZDOID = val.GetComponent().GetZDO().m_uid; ReservedItems.Add(_reservedZDOID); SetTask("FeedSmelter", val); } else { DropHoldingItem(); } } private GameObject FindNextSmelterForHeldItem() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_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_0250: Unknown result type (might be due to invalid IL or missing references) //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Unknown result type (might be due to invalid IL or missing references) if (_heldItemData == null) { return null; } Collider[] array = Physics.OverlapSphere(((Component)this).transform.position, Plugin.WorkRadius.Value, LayerMask.GetMask(new string[1] { "piece" })); GameObject result = null; float num = float.MaxValue; string text = (((Object)(object)_heldItemData.m_dropPrefab != (Object)null) ? ((Object)_heldItemData.m_dropPrefab).name : _heldItemData.m_shared.m_name); Collider[] array2 = array; foreach (Collider val in array2) { Smelter componentInParent = ((Component)val).GetComponentInParent(); if (!((Object)(object)componentInParent != (Object)null)) { continue; } ZNetView component = ((Component)componentInParent).GetComponent(); if ((Object)(object)component == (Object)null || !component.IsValid()) { continue; } ZDOID uid = component.GetZDO().m_uid; if ((ReservedItems.Contains(uid) && _reservedZDOID != uid) || (_blacklistedObjects.ContainsKey(((Component)componentInParent).gameObject) && Time.time < _blacklistedObjects[((Component)componentInParent).gameObject])) { continue; } bool flag = (Object)(object)componentInParent.m_fuelItem != (Object)null && componentInParent.m_fuelItem.m_itemData.m_shared.m_name == _heldItemData.m_shared.m_name; bool flag2 = false; if (!flag && componentInParent.m_conversion != null) { foreach (ItemConversion item in componentInParent.m_conversion) { if ((Object)(object)item.m_from != (Object)null && ((Object)((Component)item.m_from).gameObject).name == text) { flag2 = true; break; } } } if (flag) { float num2 = component.GetZDO().GetFloat("fuel", 0f); if (num2 < (float)componentInParent.m_maxFuel) { float num3 = Vector3.Distance(((Component)this).transform.position, ((Component)componentInParent).transform.position); if (num3 < num) { num = num3; result = ((Component)componentInParent).gameObject; } } } else { if (!flag2) { continue; } int num4 = component.GetZDO().GetInt("queued", 0); if (num4 < componentInParent.m_maxOre) { float num5 = Vector3.Distance(((Component)this).transform.position, ((Component)componentInParent).transform.position); if (num5 < num) { num = num5; result = ((Component)componentInParent).gameObject; } } } } return result; } private bool IsUnderAttack() { //IL_006e: 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) if ((Object)(object)_monsterAI != (Object)null && ((Object)(object)((BaseAI)_monsterAI).GetTargetCreature() != (Object)null || ((BaseAI)_monsterAI).IsAlerted())) { return true; } if ((Object)(object)RandEventSystem.instance != (Object)null && RandEventSystem.instance.GetCurrentRandomEvent() != null) { RandomEvent currentRandomEvent = RandEventSystem.instance.GetCurrentRandomEvent(); if (Vector3.Distance(((Component)this).transform.position, currentRandomEvent.m_pos) <= 100f) { return true; } } return false; } private Container FindInboxChestWithValidItems() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) List list = new List(); Piece.GetAllPiecesInRadius(((Component)this).transform.position, Plugin.WorkRadius.Value, list); foreach (Piece item in list) { if (!((Object)item).name.StartsWith("AssistantInboxChest") && !item.m_name.Contains("Caixa de Entrada")) { continue; } Container component = ((Component)item).GetComponent(); if (!((Object)(object)component != (Object)null) || component.GetInventory().GetAllItems().Count <= 0) { continue; } foreach (ItemData allItem in component.GetInventory().GetAllItems()) { if (allItem.m_shared.m_maxStackSize > 1 && HasDestinationChestForItem(allItem.m_shared.m_name)) { return component; } } } return null; } private bool HasDestinationChestForItem(string localizedName) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrEmpty(localizedName)) { return false; } List list = new List(); Piece.GetAllPiecesInRadius(((Component)this).transform.position, Plugin.WorkRadius.Value, list); foreach (Piece item in list) { if (((Object)item).name.StartsWith("AssistantInboxChest") || item.m_name.Contains("Caixa de Entrada") || ((Object)item).name.Contains("personal")) { continue; } Container component = ((Component)item).GetComponent(); if (!((Object)(object)component != (Object)null) || component.GetInventory() == null) { continue; } Inventory inventory = component.GetInventory(); if (!inventory.HaveItem(localizedName, true)) { continue; } bool flag = false; foreach (ItemData allItem in inventory.GetAllItems()) { if (allItem.m_shared.m_name == localizedName && allItem.m_stack < allItem.m_shared.m_maxStackSize) { flag = true; break; } } if (!flag && inventory.GetEmptySlots() > 0) { flag = true; } if (!flag) { continue; } return true; } return false; } private void ExecuteTakeFromInbox() { float value = Plugin.ChestDistance.Value; if (IsCloseEnough(_targetObj, value, value)) { Container component = _targetObj.GetComponent(); if ((Object)(object)component != (Object)null && component.GetInventory() != null) { foreach (ItemData allItem in component.GetInventory().GetAllItems()) { if (allItem.m_shared.m_maxStackSize <= 1 || !HasDestinationChestForItem(allItem.m_shared.m_name)) { continue; } int num = Mathf.Min(allItem.m_stack, allItem.m_shared.m_maxStackSize); if ((Object)(object)allItem.m_dropPrefab == (Object)null) { continue; } _heldItemData = allItem.Clone(); _heldItemData.m_stack = num; ((Component)component).GetComponent().ClaimOwnership(); component.GetInventory().RemoveItem(allItem, num); ZSyncAnimation component2 = ((Component)this).GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.SetTrigger("interact"); } component.SetInUse(true); ((MonoBehaviour)this).StartCoroutine(CloseChest(component)); ZSFX componentInChildren = _targetObj.GetComponentInChildren(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.Play(); } break; } } SetTask("Idle", null); FindNewTask(); } else { _monsterAI.SetFollowTarget(_targetObj); } } } public class AssistantBedMarker : MonoBehaviour { private GameObject _marker; private ZNetView _nview; private void Start() { //IL_0058: 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) _nview = ((Component)this).GetComponent(); GameObject prefab = Cache.GetPrefab("piece_workbench"); if (!((Object)(object)prefab != (Object)null)) { return; } CraftingStation component = prefab.GetComponent(); if ((Object)(object)component != (Object)null && (Object)(object)component.m_areaMarker != (Object)null) { _marker = Object.Instantiate(component.m_areaMarker, ((Component)this).transform.position, Quaternion.identity, ((Component)this).transform); _marker.SetActive(false); float value = Plugin.WorkRadius.Value; CircleProjector componentInChildren = _marker.GetComponentInChildren(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.m_radius = value; componentInChildren.m_nrOfSegments = Mathf.Max(32, (int)(value * 4f)); } } } private void Update() { if ((Object)(object)_marker != (Object)null && (Object)(object)_nview != (Object)null && _nview.IsValid()) { bool flag = _nview.GetZDO().GetBool("AssistantShowRadius", false); if (_marker.activeSelf != flag) { _marker.SetActive(flag); } } } } public class AssistantSpawner : MonoBehaviour, Hoverable, Interactable { public enum Profession { Geral, Organizador, Ferreiro, Reparador } private ZNetView _nview; private GameObject _spawnedNPC; private const string ZDO_NPC_ID = "AssistantNPC_ID"; private ZDOID _cachedNpcId = ZDOID.None; private void Awake() { _nview = ((Component)this).GetComponent(); ((MonoBehaviour)this).Invoke("TrySpawnNPC", 1f); } private void TrySpawnNPC() { //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_0040: 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_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_013b: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_007b: 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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_nview == (Object)null || !_nview.IsOwner()) { return; } ZDOID val = (_cachedNpcId = _nview.GetZDO().GetZDOID("AssistantNPC_ID")); if (val == ZDOID.None) { GameObject prefab = Cache.GetPrefab("BaseAssistantNPC"); if ((Object)(object)prefab != (Object)null) { Vector3 val2 = ((Component)this).transform.position + ((Component)this).transform.forward * 1.5f + Vector3.up * 1f; _spawnedNPC = Object.Instantiate(prefab, val2, ((Component)this).transform.rotation); ZNetView component = _spawnedNPC.GetComponent(); if ((Object)(object)component != (Object)null) { _cachedNpcId = component.GetZDO().m_uid; _nview.GetZDO().Set("AssistantNPC_ID", _cachedNpcId); component.GetZDO().Set("HomeBedPos", ((Component)this).transform.position); } } } else { ZDO zDO = ZDOMan.instance.GetZDO(val); if (zDO != null) { zDO.Set("HomeBedPos", ((Component)this).transform.position); } } ((MonoBehaviour)this).Invoke("UpdateNPCIdentity", 0.5f); } public string GetAssistantName() { if ((Object)(object)_nview == (Object)null || !_nview.IsValid()) { return "Assistente"; } return _nview.GetZDO().GetString("AssistantName", "Assistente da Base"); } public Profession GetProfession() { if ((Object)(object)_nview == (Object)null || !_nview.IsValid()) { return Profession.Geral; } return (Profession)_nview.GetZDO().GetInt("AssistantProfession", 0); } public void CallNPC() { //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_003f: 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_0055: 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_004f: 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_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_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_008d: 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) //IL_009c: 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_00a8: 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_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_nview == (Object)null || !_nview.IsValid()) { return; } ZDOID val = _nview.GetZDO().GetZDOID("AssistantNPC_ID"); if (val == ZDOID.None) { val = _cachedNpcId; } if (!(val != ZDOID.None)) { return; } Vector3 position = ((Component)this).transform.position + ((Component)this).transform.forward * 3f + Vector3.up * 1f; GameObject val2 = ZNetScene.instance.FindInstance(val); if ((Object)(object)val2 != (Object)null) { val2.transform.position = position; } else { ZDO zDO = ZDOMan.instance.GetZDO(val); if (zDO != null) { zDO.SetPosition(position); ZDOMan.instance.ForceSendZDO(val); } } MessageHud.instance.ShowMessage((MessageType)2, "Assistente Desatolado!", 0, (Sprite)null, false); } public void ApplyConfigurations() { if (!((Object)(object)_nview == (Object)null) && _nview.IsValid() && _nview.IsOwner()) { UpdateNPCIdentity(); } } private void UpdateNPCIdentity() { //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_0017: 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_002d: 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_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_0045: 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_011d: Unknown result type (might be due to invalid IL or missing references) ZDOID val = _nview.GetZDO().GetZDOID("AssistantNPC_ID"); if (val == ZDOID.None) { val = _cachedNpcId; } if (!(val != ZDOID.None)) { return; } GameObject val2 = ZNetScene.instance.FindInstance(val); if ((Object)(object)val2 != (Object)null) { ZNetView component = val2.GetComponent(); if ((Object)(object)component != (Object)null && component.IsValid()) { component.ClaimOwnership(); } } ZDO zDO = ZDOMan.instance.GetZDO(val); if (zDO != null) { if (!zDO.IsOwner()) { zDO.SetOwner(ZDOMan.GetSessionID()); } zDO.Set("AssistantName", GetAssistantName()); zDO.Set("AssistantProfession", (int)GetProfession()); zDO.Set("AssistantPaused", _nview.GetZDO().GetBool("AssistantPaused", false)); zDO.Set("TotemID", _nview.GetZDO().m_uid); } } public string GetHoverText() { string assistantName = GetAssistantName(); string text = GetProfession().ToString(); return "Totem do Assistente: " + assistantName + "\nProfissão: " + text + "\n[E] Configurar Totem"; } public string GetHoverName() { return "Totem do Assistente"; } public bool Interact(Humanoid user, bool hold, bool alt) { if (hold) { return false; } if ((Object)(object)_nview == (Object)null || !_nview.IsValid()) { return false; } long num = _nview.GetZDO().GetLong("creator", 0L); long playerID = Player.m_localPlayer.GetPlayerID(); if (num != 0L && playerID != num && !SynchronizationManager.Instance.PlayerIsAdmin) { ((Character)user).Message((MessageType)2, "Acesso Negado: Somente o criador original ou um Administrador podem gerenciar este Assistente.", 0, (Sprite)null); return true; } if ((Object)(object)AssistantUI.instance != (Object)null && !AssistantUI.instance.IsVisible()) { _nview.ClaimOwnership(); AssistantUI.instance.OpenUI(this); } return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } public void OnTotemDestroyed() { //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_003f: 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_0055: 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_004f: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_nview == (Object)null || !_nview.IsValid()) { return; } ZDOID val = _nview.GetZDO().GetZDOID("AssistantNPC_ID"); if (val == ZDOID.None) { val = _cachedNpcId; } if (!(val != ZDOID.None)) { return; } GameObject val2 = ZNetScene.instance.FindInstance(val); if ((Object)(object)val2 != (Object)null) { ZNetView component = val2.GetComponent(); if ((Object)(object)component != (Object)null && component.IsValid()) { component.ClaimOwnership(); GameObject prefab = Cache.GetPrefab("vfx_corpse_destruction"); if ((Object)(object)prefab != (Object)null) { Object.Instantiate(prefab, val2.transform.position, Quaternion.identity); } component.Destroy(); } } else { ZDO zDO = ZDOMan.instance.GetZDO(val); if (zDO != null) { ZDOMan.instance.DestroyZDO(zDO); } } } } [HarmonyPatch(typeof(Player), "PlacePiece")] public static class Player_PlacePiece_Patch { public static bool Prefix(Player __instance, Piece piece) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)piece != (Object)null && ((Object)((Component)piece).gameObject).name.Contains("AssistantTotem")) { int num = 0; AssistantSpawner[] array = Object.FindObjectsOfType(); AssistantSpawner[] array2 = array; foreach (AssistantSpawner assistantSpawner in array2) { ZNetView component = ((Component)assistantSpawner).GetComponent(); if (!((Object)(object)component == (Object)null) && component.GetZDO() != null && Vector3.Distance(((Component)__instance).transform.position, ((Component)assistantSpawner).transform.position) < Plugin.WorkRadius.Value) { num++; } } if (num >= 3) { ((Character)__instance).Message((MessageType)2, "Limite de 3 Assistentes por base atingido!", 0, (Sprite)null); return false; } } return true; } } [HarmonyPatch(typeof(WearNTear), "Destroy")] public static class WearNTear_Destroy_Patch { public static void Prefix(WearNTear __instance) { AssistantSpawner component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null) { component.OnTotemDestroyed(); } } } [HarmonyPatch(typeof(WearNTear), "Remove")] public static class WearNTear_Remove_Patch { public static void Prefix(WearNTear __instance) { AssistantSpawner component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null) { component.OnTotemDestroyed(); } } } public class AssistantUI : MonoBehaviour { public static AssistantUI instance; private GameObject _uiRoot; private InputField _nameInput; private int _currentProfIndex = 0; private string[] _profNames = new string[4] { "0 - Faz-Tudo (Geral)", "1 - Organizador", "2 - Ferreiro", "3 - Reparador" }; private Text _profBtnText; private Toggle _showRadiusToggle; private Toggle _pauseToggle; private AssistantSpawner _currentSpawner; private void Awake() { instance = this; } private void CreateUI() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_019f: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: 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) //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Expected O, but got Unknown //IL_0250: 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_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02ae: Unknown result type (might be due to invalid IL or missing references) //IL_02bc: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Expected O, but got Unknown //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_02fa: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Expected O, but got Unknown if ((Object)(object)_uiRoot != (Object)null) { return; } _uiRoot = new GameObject("AssistantUI_Root"); _uiRoot.transform.SetParent(((Component)this).transform); Canvas val = _uiRoot.AddComponent(); val.renderMode = (RenderMode)0; val.sortingOrder = 9999; CanvasScaler val2 = _uiRoot.AddComponent(); val2.uiScaleMode = (ScaleMode)1; val2.referenceResolution = new Vector2(1920f, 1080f); GraphicRaycaster val3 = _uiRoot.AddComponent(); GameObject val4 = new GameObject("Panel"); val4.transform.SetParent(_uiRoot.transform, false); Image val5 = val4.AddComponent(); val5.sprite = GUIManager.Instance.GetSprite("woodpanel_settings"); val5.type = (Type)1; RectTransform component = val4.GetComponent(); component.sizeDelta = new Vector2(350f, 420f); component.anchoredPosition = Vector2.zero; Font font = Font.CreateDynamicFontFromOSFont("Arial", 16); Font font2 = Font.CreateDynamicFontFromOSFont("Arial", 16); CreateText(val4.transform, "PAINEL DO ASSISTENTE", new Vector2(0f, 175f), 20, font, (TextAnchor)4, new Color(1f, 0.6f, 0f)); CreateText(val4.transform, "Nome do Assistente:", new Vector2(0f, 130f), 16, font2, (TextAnchor)4, Color.white); _nameInput = CreateInputField(val4.transform, new Vector2(0f, 100f), new Vector2(250f, 30f), font2); CreateText(val4.transform, "Profissão (Clique para trocar):", new Vector2(0f, 50f), 16, font2, (TextAnchor)4, Color.white); Button val6 = CreateButton(val4.transform, _profNames[0], new Vector2(0f, 20f), new Vector2(250f, 30f), font2, (UnityAction)delegate { _currentProfIndex = (_currentProfIndex + 1) % _profNames.Length; _profBtnText.text = _profNames[_currentProfIndex]; }); _profBtnText = ((Component)val6).GetComponentInChildren(); _showRadiusToggle = CreateToggle(val4.transform, "Mostrar Raio de Trabalho", new Vector2(0f, -30f), font2); _pauseToggle = CreateToggle(val4.transform, "Pausar Assistente (Férias)", new Vector2(0f, -65f), font2); CreateButton(val4.transform, "Chamar NPC (Desatolar)", new Vector2(0f, -115f), new Vector2(250f, 40f), font, (UnityAction)delegate { if ((Object)(object)_currentSpawner != (Object)null) { _currentSpawner.CallNPC(); } }); CreateButton(val4.transform, "Salvar e Fechar", new Vector2(0f, -165f), new Vector2(250f, 40f), font, (UnityAction)delegate { SaveChanges(); CloseUI(); }); _uiRoot.SetActive(false); } private Text CreateText(Transform parent, string text, Vector2 pos, int size, Font font, TextAnchor anchor, Color color) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_003c: 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_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Text"); val.transform.SetParent(parent, false); Text val2 = val.AddComponent(); val2.text = text; val2.font = font; val2.fontSize = size; val2.alignment = anchor; ((Graphic)val2).color = color; RectTransform component = val.GetComponent(); component.anchoredPosition = pos; component.sizeDelta = new Vector2(300f, 30f); return val2; } private InputField CreateInputField(Transform parent, Vector2 pos, Vector2 size, Font font) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0082: 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_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00db: 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_0102: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("InputField"); val.transform.SetParent(parent, false); Image val2 = val.AddComponent(); val2.sprite = GUIManager.Instance.GetSprite("text_field"); val2.type = (Type)1; InputField val3 = val.AddComponent(); GameObject val4 = new GameObject("Text"); val4.transform.SetParent(val.transform, false); Text val5 = val4.AddComponent(); val5.font = font; val5.fontSize = 16; ((Graphic)val5).color = Color.white; val5.alignment = (TextAnchor)4; RectTransform component = val4.GetComponent(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = new Vector2(5f, 0f); component.offsetMax = new Vector2(-5f, 0f); val3.textComponent = val5; RectTransform component2 = val.GetComponent(); component2.anchoredPosition = pos; component2.sizeDelta = size; return val3; } private Toggle CreateToggle(Transform parent, string label, Vector2 pos, Font font) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Expected O, but got Unknown //IL_0070: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: 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_0124: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Expected O, but got Unknown //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Toggle"); val.transform.SetParent(parent, false); Toggle val2 = val.AddComponent(); GameObject val3 = new GameObject("Background"); val3.transform.SetParent(val.transform, false); Image val4 = val3.AddComponent(); val4.sprite = GUIManager.Instance.GetSprite("checkbox"); RectTransform component = val3.GetComponent(); component.anchoredPosition = new Vector2(-120f, 0f); component.sizeDelta = new Vector2(24f, 24f); GameObject val5 = new GameObject("Checkmark"); val5.transform.SetParent(val3.transform, false); Image val6 = val5.AddComponent(); val6.sprite = GUIManager.Instance.GetSprite("checkbox_marker"); RectTransform component2 = val5.GetComponent(); component2.anchorMin = Vector2.zero; component2.anchorMax = Vector2.one; component2.offsetMin = Vector2.zero; component2.offsetMax = Vector2.zero; ((Selectable)val2).targetGraphic = (Graphic)(object)val4; val2.graphic = (Graphic)(object)val6; GameObject val7 = new GameObject("Label"); val7.transform.SetParent(val.transform, false); Text val8 = val7.AddComponent(); val8.text = label; val8.font = font; val8.fontSize = 16; ((Graphic)val8).color = Color.white; val8.alignment = (TextAnchor)3; RectTransform component3 = val7.GetComponent(); component3.anchoredPosition = new Vector2(40f, 0f); component3.sizeDelta = new Vector2(250f, 30f); RectTransform component4 = val.GetComponent(); component4.anchoredPosition = pos; component4.sizeDelta = new Vector2(300f, 30f); return val2; } private Button CreateButton(Transform parent, string label, Vector2 pos, Vector2 size, Font font, UnityAction onClick) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0099: 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_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Button"); val.transform.SetParent(parent, false); Image val2 = val.AddComponent(); val2.sprite = GUIManager.Instance.GetSprite("button"); val2.type = (Type)1; Button val3 = val.AddComponent