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; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: AssemblyCompany("BaseAssistant")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Base Assistant Mod for Valheim")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+f4c8ee754032a6b2544ff8e5e85a0bde6031bd1d")] [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; private float _scanInterval = 2f; private float _timeSinceLastScan; private float _greetCooldown; private float _taskTimeout; private GameObject _targetObj; private string _currentTask = "Idle"; private ItemData _heldItemData; private bool _weaponsCleared; private Dictionary _blacklistedObjects = new Dictionary(); public static HashSet ReservedItems = new HashSet(); private ZDOID _reservedZDOID = ZDOID.None; private Vector3 _lastPos; private float _stuckTimer; private bool _isSleeping; private bool _wasNight; 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 static Dictionary _messageCooldowns = new Dictionary(); private GameObject _targetSmelter; private void Awake() { //IL_0045: 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; } } private void Update() { //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Invalid comparison between Unknown and I4 //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Invalid comparison between Unknown and I4 //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Invalid comparison between Unknown and I4 if ((Object)(object)_nview == (Object)null || !_nview.IsOwner()) { return; } 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 { _character.m_name = "Assistente da Base"; } } _timeSinceLastScan += Time.deltaTime; if (_timeSinceLastScan >= _scanInterval) { _timeSinceLastScan = 0f; CheckForPlayerGreeting(); ProcessAI(); } } private void SayMessage(string msgId, string text, float cooldownMinutes = 3f, bool force = false) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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) 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_0013: 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) 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_0007: Unknown result type (might be due to invalid IL or missing references) List list = new List(); Piece.GetAllPiecesInRadius(GetBaseCenter(), 15f, list); foreach (Piece item in list) { if (((Object)item).name.StartsWith("BaseAssistantBed") || item.m_name.Contains("Cama do Assistente")) { return ((Component)item).gameObject; } } return null; } private GameObject FindTotem() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) List list = new List(); Piece.GetAllPiecesInRadius(GetBaseCenter(), 5f, list); foreach (Piece item in list) { if (((Object)item).name.StartsWith("AssistantTotem") || (Object)(object)((Component)item).GetComponent() != (Object)null) { return ((Component)item).gameObject; } } return null; } private void ReleaseReservation() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) _reservedZDOID = ZDOID.None; } private void SetTask(string task, GameObject target) { if (task != _currentTask) { ReleaseReservation(); } _currentTask = task; _targetObj = target; _taskTimeout = 15f; _stuckTimer = 0f; if ((Object)(object)_monsterAI != (Object)null) { _monsterAI.SetFollowTarget(target); } } private void ProcessAI() { //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_014b: 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_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: 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_018d: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: 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_0225: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_037e: Unknown result type (might be due to invalid IL or missing references) //IL_0384: Unknown result type (might be due to invalid IL or missing references) //IL_0442: Unknown result type (might be due to invalid IL or missing references) //IL_0447: Unknown result type (might be due to invalid IL or missing references) bool flag = (Object)(object)EnvMan.instance != (Object)null && EnvMan.IsNight(); if (flag && !_wasNight) { string text = _sleepPhrases[Random.Range(0, _sleepPhrases.Length)]; SayMessage("night_start", text, 10f, force: true); _wasNight = true; GameObject val = FindBed(); if ((Object)(object)val != (Object)null) { DropHoldingItem(); SetTask("GoToSleep", val); } else { SayMessage("no_bed", "Trabalhei o dia todo e não me deram nem uma cama... Que exploração!", 10f, force: true); GameObject val2 = FindTotem(); if ((Object)(object)val2 != (Object)null) { DropHoldingItem(); SetTask("GoToSleep", val2); } } } else if (!flag && _wasNight) { string text2 = _wakePhrases[Random.Range(0, _wakePhrases.Length)]; SayMessage("morning_start", text2, 10f, force: true); _wasNight = false; _isSleeping = false; SetTask("Idle", null); GameObject val3 = FindBed(); if ((Object)(object)val3 != (Object)null) { ((Component)this).transform.position = val3.transform.position + val3.transform.forward * 1.5f + Vector3.up * 0.5f; } else { GameObject val4 = FindTotem(); if ((Object)(object)val4 != (Object)null) { ((Component)this).transform.position = val4.transform.position + val4.transform.forward * 1.5f + Vector3.up * 0.5f; } else { ((Component)this).transform.position = GetBaseCenter() + ((Component)this).transform.forward * 1.5f + Vector3.up * 0.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 && flag) { return; } if (IsUnderAttack()) { if (_currentTask != "Panic") { SetTask("Panic", null); SayMessage("panic_start", "Socorro! Monstros na base!", 5f, force: true); } GameObject val5 = FindBed(); if ((Object)(object)val5 != (Object)null) { _monsterAI.SetFollowTarget(val5); return; } GameObject val6 = FindTotem(); if ((Object)(object)val6 != (Object)null) { _monsterAI.SetFollowTarget(val6); } 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 && _currentTask == "Idle") { GameObject val7 = FindBed(); if ((Object)(object)val7 != (Object)null) { SetTask("GoToSleep", val7); return; } GameObject val8 = FindTotem(); if ((Object)(object)val8 != (Object)null) { SetTask("GoToSleep", val8); } 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") { 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(); } if (currentTask != _currentTask) { Logger.LogInfo((object)("[AssistantAI] Mudou de tarefa: " + currentTask + " -> " + _currentTask)); } } private Vector3 GetBaseCenter() { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) if ((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) { for (int i = 0; i < hits.Length; i++) { Smelter componentInParent = ((Component)hits[i]).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; } if (componentInParent.m_maxFuel > 0 && (Object)(object)componentInParent.m_fuelItem != (Object)null && component.GetZDO().GetFloat("fuel", 0f) < (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 val = FindChestForSmelterItem(hits, name, leaveAmount); if ((Object)(object)val != (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)val).gameObject); 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); } if (component.GetZDO().GetInt("queued", 0) >= 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; } } int num = CountItemInBase(name3, hits); int num2 = (name3.ToLower().Contains("coal") ? Plugin.MaxCoalAmount.Value : Plugin.MaxSmeltedMetal.Value); if (num < num2) { int leaveAmount2 = (name2.ToLower().Contains("wood") ? Plugin.LeaveWoodAmount.Value : Plugin.LeaveOreAmount.Value); Container val2 = FindChestForSmelterItem(hits, name2, leaveAmount2); if ((Object)(object)val2 != (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)val2).gameObject); return true; } } } } return false; } private Container FindChestForSmelterItem(Collider[] hits, string targetItemName, int leaveAmount) { for (int i = 0; i < hits.Length; i++) { Container componentInParent = ((Component)hits[i]).GetComponentInParent(); if ((Object)(object)componentInParent != (Object)null && componentInParent.GetInventory() != null && (!_blacklistedObjects.ContainsKey(((Component)componentInParent).gameObject) || !(Time.time < _blacklistedObjects[((Component)componentInParent).gameObject])) && componentInParent.GetInventory().CountItems(targetItemName, -1, true) > leaveAmount) { return componentInParent; } } return null; } private void ExecuteGoToSleep() { if ((Object)(object)_targetObj == (Object)null) { _currentTask = "Idle"; return; } float num = 3f; if (IsCloseEnough(_targetObj, num, num)) { _isSleeping = true; _currentTask = "Idle"; _monsterAI.SetFollowTarget((GameObject)null); } else { _monsterAI.SetFollowTarget(_targetObj); } } private void ExecuteRepairPiece() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: 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_00b5: 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; for (int i = 0; i < array2.Length; i++) { Piece componentInParent = ((Component)array2[i]).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_0001: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_0337: Unknown result type (might be due to invalid IL or missing references) //IL_033c: Unknown result type (might be due to invalid IL or missing references) //IL_0343: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_03af: Unknown result type (might be due to invalid IL or missing references) //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_03ba: Unknown result type (might be due to invalid IL or missing references) 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; for (int i = 0; i < array2.Length; i++) { ItemDrop componentInParent = ((Component)array2[i]).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 val = FindChestFor(_heldItemData, array); if ((Object)(object)val != (Object)null) { SetTask("MoveToChestToStore", ((Component)val).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; } if (Plugin.EnableSorting.Value) { Container val2 = FindInboxChestWithValidItems(); if ((Object)(object)val2 != (Object)null) { _currentTask = "TakeFromInbox"; _targetObj = ((Component)val2).gameObject; _monsterAI.SetFollowTarget(_targetObj); return; } } if (Plugin.EnableRepairing.Value) { Collider[] array2 = array; for (int i = 0; i < array2.Length; i++) { Piece componentInParent2 = ((Component)array2[i]).GetComponentInParent(); if ((Object)(object)componentInParent2 != (Object)null && (!_blacklistedObjects.ContainsKey(((Component)componentInParent2).gameObject) || !(Time.time < _blacklistedObjects[((Component)componentInParent2).gameObject]))) { WearNTear component = ((Component)componentInParent2).GetComponent(); if ((Object)(object)component != (Object)null && component.GetHealthPercentage() < Plugin.RepairHealthThreshold.Value) { SetTask("RepairPiece", ((Component)componentInParent2).gameObject); return; } } } } if (Plugin.EnableSmelting.Value && CheckAndSetSmeltingTask(array)) { return; } if (Plugin.EnableLooting.Value) { Collider[] array2 = array; for (int i = 0; i < array2.Length; i++) { ItemDrop componentInParent3 = ((Component)array2[i]).GetComponentInParent(); if ((Object)(object)componentInParent3 != (Object)null && (Object)(object)((Component)componentInParent3).GetComponent() != (Object)null && ((Component)componentInParent3).GetComponent().IsValid()) { ZDOID uid2 = ((Component)componentInParent3).GetComponent().GetZDO().m_uid; if (!ReservedItems.Contains(uid2) && (!_blacklistedObjects.ContainsKey(((Component)componentInParent3).gameObject) || !(Time.time < _blacklistedObjects[((Component)componentInParent3).gameObject])) && componentInParent3.m_itemData != null && (Object)(object)FindChestFor(componentInParent3.m_itemData, array) != (Object)null) { SetTask("PickupGround", ((Component)componentInParent3).gameObject); ReservedItems.Add(uid2); _reservedZDOID = uid2; return; } } } } if (!Plugin.EnableSorting.Value || !CheckAndSetConsolidationTask(array)) { 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 result = null; int num = -1; for (int i = 0; i < hits.Length; i++) { Container componentInParent = ((Component)hits[i]).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; result = componentInParent; } } } if (num < 0) { return null; } return result; } private int GetChestScore(Container container, ItemData targetItem, string customName) { //IL_0022: 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_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Invalid comparison between Unknown and I4 //IL_016a: 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) 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; } if (!flag) { return -1000; } return 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) { if ((allItem.m_shared.m_name?.ToLower() ?? "") == text2) { flag3 = true; } else { flag2 = true; } } } if (flag2) { return -1000; } if (flag3) { return 100; } return -1000; } private bool CheckAndSetConsolidationTask(Collider[] hits) { for (int i = 0; i < hits.Length; i++) { Container componentInParent = ((Component)hits[i]).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 val = FindChestFor(allItem, hits); if ((Object)(object)val != (Object)null && (Object)(object)val != (Object)(object)componentInParent) { string customName2 = ""; ZNetView component2 = ((Component)val).GetComponent(); if ((Object)(object)component2 != (Object)null && component2.IsValid() && component2.GetZDO() != null) { customName2 = component2.GetZDO().GetString("text", "").ToLower() .Trim(); } int chestScore2 = GetChestScore(val, 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_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: 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 if ((int)t != 3 && (int)t != 14 && (int)t != 4) { return (int)t == 19; } return true; } private bool IsArmor(ItemType t) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Invalid comparison between Unknown and I4 //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Invalid comparison between Unknown and I4 if ((int)t != 5 && (int)t != 6 && (int)t != 7 && (int)t != 11) { return (int)t == 17; } return true; } private bool IsWood(string name, ItemType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)type != 1) { return false; } if (!name.Contains("wood") && !name.Contains("log") && !name.Contains("bark") && !name.Contains("madeira")) { return name.Contains("lenha"); } return true; } private bool IsMetal(string name, ItemType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)type != 1) { return false; } if (!name.Contains("ore") && !name.Contains("scrap") && !name.Contains("copper") && !name.Contains("iron") && !name.Contains("silver") && !name.Contains("tin") && !name.Contains("bronze") && !name.Contains("metal")) { return name.Contains("flametal"); } return true; } 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; for (int i = 0; i < hits.Length; i++) { Container componentInParent = ((Component)hits[i]).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_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_0186: 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_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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_006c: 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_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009f: 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_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) 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}"); if (num < maxDistXZ) { return num2 < maxDistY; } return false; } } 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}"); if (num5 < maxDistXZ + 2f) { return num6 < maxDistY + 0.5f; } return false; } 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) { 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"); } if ((Object)(object)((Component)component).GetComponent() != (Object)null) { ((Component)component).GetComponent().Destroy(); } else { Object.Destroy((Object)(object)((Component)component).gameObject); } ClearReservationWithoutRelease(); SetTask("Idle", null); } } else { _monsterAI.SetFollowTarget(_targetObj); } } private void ExecuteStoreToChest() { //IL_03c2: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: 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_023f: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) //IL_0266: 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) 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)) { break; } component.GetInventory().AddItem(val); ItemData heldItemData = _heldItemData; heldItemData.m_stack--; } 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); for (int i = 0; i < array.Length; i++) { Container componentInParent = ((Component)array[i]).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) { ZNetView component3 = ((Component)componentInParent).GetComponent(); if ((Object)(object)component3 != (Object)null && component3.IsValid() && string.IsNullOrEmpty(component3.GetZDO().GetString("text", ""))) { 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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(10, 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) { if (!component2.IsOwner()) { component2.ClaimOwnership(); } component2.GetZDO().Set("fuel", num + (float)num3); component2.InvokeRPC(ZNetView.Everybody, "AddFuelItem", 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); } 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; } if (!component2.IsOwner()) { component2.ClaimOwnership(); } for (int i = 0; i < num6; i++) { component2.GetZDO().Set("item" + (num4 + i), text); } component2.GetZDO().Set("queued", num4 + num6); component2.InvokeRPC(ZNetView.Everybody, "AddOreItem", Array.Empty()); 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); } return; } } SetTask("Idle", null); } else { _monsterAI.SetFollowTarget(_targetObj); } } private bool IsUnderAttack() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) if (_character.GetHealth() < _character.GetMaxHealth()) { 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_000c: 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_0016: 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) { 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)) { _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, Interactable, Hoverable { private GameObject _marker; private bool _showMarker; private void Start() { //IL_0042: 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) 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)); } } } public bool Interact(Humanoid user, bool hold, bool alt) { if (hold) { return false; } _showMarker = !_showMarker; if ((Object)(object)_marker != (Object)null) { _marker.SetActive(_showMarker); } ((Character)user).Message((MessageType)2, _showMarker ? $"Área do Assistente Visível ({Plugin.WorkRadius.Value}m)" : "Área do Assistente Oculta", 0, (Sprite)null); return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } public string GetHoverText() { return "\n[E] " + (_showMarker ? "Ocultar Área de Trabalho" : "Mostrar Área de Trabalho"); } public string GetHoverName() { return "Cama do Assistente"; } } public class AssistantSpawner : MonoBehaviour { 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009c: 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_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: 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) 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); } } } private void OnDestroy() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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) if ((Object)(object)_nview == (Object)null || !_nview.IsOwner() || !(_cachedNpcId != ZDOID.None)) { return; } GameObject val = ZNetScene.instance.FindInstance(_cachedNpcId); if ((Object)(object)val != (Object)null) { ZNetView component = val.GetComponent(); if ((Object)(object)component != (Object)null) { component.ClaimOwnership(); GameObject prefab = Cache.GetPrefab("vfx_corpse_destruction"); if ((Object)(object)prefab != (Object)null) { Object.Instantiate(prefab, val.transform.position, Quaternion.identity); } component.Destroy(); } } else { ZDO zDO = ZDOMan.instance.GetZDO(_cachedNpcId); 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_0054: 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) if ((Object)(object)piece != (Object)null && ((Object)((Component)piece).gameObject).name.Contains("AssistantTotem")) { int num = 0; AssistantSpawner[] array = Object.FindObjectsOfType(); foreach (AssistantSpawner assistantSpawner in array) { 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; } } public class AssistantChestTextReceiver : MonoBehaviour, TextReceiver { public string GetText() { ZNetView component = ((Component)this).GetComponent(); if ((Object)(object)component == (Object)null || !component.IsValid()) { return ""; } return component.GetZDO().GetString("text", ""); } public void SetText(string text) { ZNetView component = ((Component)this).GetComponent(); if ((Object)(object)component != (Object)null && component.IsValid()) { component.ClaimOwnership(); component.GetZDO().Set("text", text); } } } [HarmonyPatch(typeof(Container))] public static class ContainerPatches { private static void EnsureTextReceiver(Container container) { if ((Object)(object)((Component)container).GetComponent() == (Object)null) { ((Component)container).gameObject.AddComponent(); } } [HarmonyPatch("Interact")] [HarmonyPrefix] public static bool Interact_Prefix(Container __instance, Humanoid character, bool hold, bool alt) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) EnsureTextReceiver(__instance); if (hold) { return true; } if (alt) { if (!PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, true, false)) { return false; } TextInput.instance.RequestText((TextReceiver)(object)((Component)__instance).GetComponent(), "Configuração do Assistente", 20); return false; } return true; } [HarmonyPatch("GetHoverText")] [HarmonyPostfix] public static void GetHoverText_Postfix(Container __instance, ref string __result) { EnsureTextReceiver(__instance); ZNetView component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null && component.IsValid()) { string text = component.GetZDO().GetString("text", ""); if (!string.IsNullOrEmpty(text)) { __result = "[" + text + "]\n" + __result; } __result += "\n[L-Shift + E] Renomear (Assistente)"; } } } [BepInPlugin("com.singularitydot.baseassistant", "Base Assistant", "0.1.3")] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { public const string PluginGUID = "com.singularitydot.baseassistant"; public const string PluginName = "Base Assistant"; public const string PluginVersion = "0.1.3"; public static ConfigEntry WorkRadius; public static ConfigEntry RepairDistance; public static ConfigEntry ChestDistance; public static ConfigEntry KilnDistance; public static ConfigEntry GroundItemDistance; public static ConfigEntry StuckTimeout; public static ConfigEntry TaskTimeout; public static ConfigEntry NpcWalkSpeed; public static ConfigEntry NpcRunSpeed; public static ConfigEntry RepairHealthThreshold; public static ConfigEntry AoERepairRadius; public static ConfigEntry MaxCoalAmount; public static ConfigEntry MaxSmeltedMetal; public static ConfigEntry LeaveWoodAmount; public static ConfigEntry LeaveCoalAmount; public static ConfigEntry LeaveOreAmount; public static ConfigEntry EnableRepairing; public static ConfigEntry EnableSmelting; public static ConfigEntry EnableLooting; public static ConfigEntry EnableSorting; public static ConfigEntry EnableAutoLabeling; public static ConfigEntry TagWeapons; public static ConfigEntry TagArmor; public static ConfigEntry TagFood; public static ConfigEntry TagWood; public static ConfigEntry TagMetal; public static ConfigEntry TagIgnore; private readonly Harmony harmony = new Harmony("com.singularitydot.baseassistant"); private float _configReloadTimer; private void Awake() { harmony.PatchAll(); EnableRepairing = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "AtivarReparos", true, "Permite que o assistente repare estruturas danificadas."); EnableSmelting = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "AtivarFornalhas", true, "Permite que o assistente abasteça fornalhas e fundições."); EnableLooting = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "AtivarColetaDeChao", true, "Permite que o assistente pegue itens soltos no chão."); EnableSorting = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "AtivarOrganizacao", true, "Permite que o assistente organize itens do baú mestre para os outros baús."); EnableAutoLabeling = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "AtivarAutoRotulagem", true, "Permite que o assistente renomeie baús vazios automaticamente ao guardar itens."); WorkRadius = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "RaioDeTrabalho", 30f, "Raio de ação do assistente a partir do Totem."); RepairHealthThreshold = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "VidaParaReparo", 0.8f, "Porcentagem de vida (0.0 a 1.0) para que o assistente decida consertar uma estrutura."); AoERepairRadius = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "RaioReparoEmArea", 10f, "Raio (em metros) em volta da peça que ele vai consertar tudo de uma vez com o poder da telepatia."); NpcWalkSpeed = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "VelocidadeAndar", 3f, "Velocidade do NPC quando está andando."); NpcRunSpeed = ((BaseUnityPlugin)this).Config.Bind("1. Geral", "VelocidadeCorrer", 6f, "Velocidade do NPC quando está correndo para concluir uma tarefa."); TagWeapons = ((BaseUnityPlugin)this).Config.Bind("5. Regras de Baus", "TagArmas", "armas, weapons, arsenal", "Palavras-chave (separadas por vírgula) que o assistente reconhecerá no nome do baú para guardar Armas e Ferramentas."); TagArmor = ((BaseUnityPlugin)this).Config.Bind("5. Regras de Baus", "TagArmadura", "armaduras, armor, equipamentos", "Palavras-chave que o assistente reconhecerá para guardar Armaduras e Escudos."); TagFood = ((BaseUnityPlugin)this).Config.Bind("5. Regras de Baus", "TagComida", "comida, food, rango, consumiveis", "Palavras-chave que o assistente reconhecerá para guardar Comidas e Poções."); TagWood = ((BaseUnityPlugin)this).Config.Bind("5. Regras de Baus", "TagMadeira", "wood, lenha", "Palavras-chave que o assistente reconhecerá para guardar Madeiras em geral."); TagMetal = ((BaseUnityPlugin)this).Config.Bind("5. Regras de Baus", "TagMetal", "metal, minério, ore", "Palavras-chave que o assistente reconhecerá para guardar Minérios e Metais fundidos."); TagIgnore = ((BaseUnityPlugin)this).Config.Bind("5. Regras de Baus", "TagIgnorar", "ignorar, privado, nao tocar, ignore", "Palavras-chave que o assistente reconhecerá para IGNORAR completamente o baú."); string text = "\n[AVISO] Alterar as distâncias de interação pode deixar o visual do jogo estranho e algumas vezes macabro (telecinese e itens flutuando).\n[Warning] Changing interaction distances may cause weird or macabre visual behaviors (telekinesis and floating items)."; RepairDistance = ((BaseUnityPlugin)this).Config.Bind("2. Distancias", "DistanciaParaConserto", 6f, "Distância máxima para ele consertar paredes, pisos e fornalhas." + text); KilnDistance = ((BaseUnityPlugin)this).Config.Bind("2. Distancias", "DistanciaFornalha", 4f, "Distância máxima para abastecer fornalhas." + text); ChestDistance = ((BaseUnityPlugin)this).Config.Bind("2. Distancias", "DistanciaBau", 2.5f, "Distância máxima para guardar ou pegar itens no baú." + text); GroundItemDistance = ((BaseUnityPlugin)this).Config.Bind("2. Distancias", "DistanciaItemChao", 2f, "Distância máxima para pegar itens que estão no chão." + text); StuckTimeout = ((BaseUnityPlugin)this).Config.Bind("3. Desatolamento", "TempoAteTeleportar", 5f, "Tempo (em segundos) que ele precisa ficar travado para ativar o teleporte."); TaskTimeout = ((BaseUnityPlugin)this).Config.Bind("3. Desatolamento", "TempoMaximoTarefa", 60f, "Tempo máximo (em segundos) que ele fica tentando concluir uma tarefa antes de desistir e resetar."); MaxCoalAmount = ((BaseUnityPlugin)this).Config.Bind("4. Producao", "MaximoCarvao", 200, "Quantidade máxima de carvão nos baús antes do Assistente parar de abastecer a Fornalha de Carvão."); MaxSmeltedMetal = ((BaseUnityPlugin)this).Config.Bind("4. Producao", "MaximoMetal", 100, "Quantidade máxima de um metal nos baús antes do Assistente parar de colocar minério na Fundição."); LeaveWoodAmount = ((BaseUnityPlugin)this).Config.Bind("4. Producao", "ReservaMadeira", 10, "Quantidade mínima de segurança de madeira que ele nunca vai retirar do baú."); LeaveCoalAmount = ((BaseUnityPlugin)this).Config.Bind("4. Producao", "ReservaCarvao", 10, "Quantidade mínima de segurança de carvão que ele nunca vai retirar do baú para fornalhas."); LeaveOreAmount = ((BaseUnityPlugin)this).Config.Bind("4. Producao", "ReservaMinerio", 0, "Quantidade mínima de segurança de minério cru que ele deixará intocado no baú."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"O mod Base Assistant (v0.1.3) foi carregado com sucesso!"); PrefabManager.OnVanillaPrefabsAvailable += RegisterPieces; PrefabManager.OnVanillaPrefabsAvailable += ModifyClonedPrefabs; PrefabManager.OnVanillaPrefabsAvailable += CreateAssistantPrefab; CommandManager.Instance.AddConsoleCommand((ConsoleCommand)(object)new ClearChestsCommand()); } private void RegisterPieces() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0050: 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_0060: 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_0070: Expected O, but got Unknown //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_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_00ee: 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_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Expected O, but got Unknown //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Expected O, but got Unknown //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Expected O, but got Unknown //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Expected O, but got Unknown //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01be: 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_01cd: Expected O, but got Unknown //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: 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_01e6: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Expected O, but got Unknown //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Expected O, but got Unknown //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Expected O, but got Unknown PieceManager.Instance.AddPieceCategory("Hammer", "Base Assistant"); PieceConfig val = new PieceConfig(); val.Name = "Caixa de Entrada (Assistente)"; val.Description = "Baú Mestre: Coloque seus itens aqui para o Assistente organizar automaticamente nos outros baús da base."; val.PieceTable = "Hammer"; val.Category = "Base Assistant"; val.Requirements = (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig { Item = "Wood", Amount = 10, Recover = true }, new RequirementConfig { Item = "Resin", Amount = 2, Recover = true } }; PieceConfig val2 = val; PieceManager.Instance.AddPiece(new CustomPiece("AssistantInboxChest", "piece_chest_wood", val2)); val = new PieceConfig(); val.Name = "Totem do Assistente"; val.Description = "Invoque o Assistente Dverger! O totem define o centro da área de trabalho do seu assistente."; val.PieceTable = "Hammer"; val.Category = "Base Assistant"; val.Requirements = (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig { Item = "Wood", Amount = 10, Recover = true }, new RequirementConfig { Item = "GreydwarfEye", Amount = 1, Recover = true } }; PieceConfig val3 = val; PieceManager.Instance.AddPiece(new CustomPiece("AssistantTotem", "guard_stone", val3)); val = new PieceConfig(); val.Name = "Cama do Assistente"; val.Description = "Construa esta cama para que o seu Assistente tenha onde dormir à noite."; val.PieceTable = "Hammer"; val.Category = "Base Assistant"; val.Requirements = (RequirementConfig[])(object)new RequirementConfig[4] { new RequirementConfig { Item = "Wood", Amount = 10, Recover = true }, new RequirementConfig { Item = "DeerHide", Amount = 4, Recover = true }, new RequirementConfig { Item = "LeatherScraps", Amount = 4, Recover = true }, new RequirementConfig { Item = "BronzeNails", Amount = 5, Recover = true } }; PieceConfig val4 = val; PieceManager.Instance.AddPiece(new CustomPiece("BaseAssistantBed", "bed", val4)); } private void ModifyClonedPrefabs() { GameObject prefab = Cache.GetPrefab("AssistantTotem"); if ((Object)(object)prefab != (Object)null) { PrivateArea component = prefab.GetComponent(); if ((Object)(object)component != (Object)null) { Object.DestroyImmediate((Object)(object)component, true); } CircleProjector[] componentsInChildren = prefab.GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { Object.DestroyImmediate((Object)(object)((Component)componentsInChildren[i]).gameObject, true); } prefab.AddComponent(); prefab.AddComponent(); } GameObject prefab2 = Cache.GetPrefab("BaseAssistantBed"); if ((Object)(object)prefab2 != (Object)null) { Bed component2 = prefab2.GetComponent(); if ((Object)(object)component2 != (Object)null) { Object.DestroyImmediate((Object)(object)component2, true); } } PrefabManager.OnVanillaPrefabsAvailable -= ModifyClonedPrefabs; } private void Update() { _configReloadTimer += Time.deltaTime; if (_configReloadTimer >= 5f) { _configReloadTimer = 0f; ((BaseUnityPlugin)this).Config.Reload(); } } private void CreateAssistantPrefab() { //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown GameObject prefab = Cache.GetPrefab("Dverger"); if ((Object)(object)prefab == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"Não foi possível encontrar o modelo do Dverger!"); return; } GameObject obj = PrefabManager.Instance.CreateClonedPrefab("BaseAssistantNPC", prefab); Character component = obj.GetComponent(); if ((Object)(object)component != (Object)null) { component.m_name = "Assistente da Base"; } CharacterDrop component2 = obj.GetComponent(); if ((Object)(object)component2 != (Object)null) { Object.Destroy((Object)(object)component2); } MonsterAI component3 = obj.GetComponent(); if ((Object)(object)component3 != (Object)null) { ((BaseAI)component3).m_idleSound = new EffectList(); } obj.AddComponent(); CustomCreature val = new CustomCreature(obj, true); CreatureManager.Instance.AddCreature(val); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Assistente Base gerada com sucesso!"); PrefabManager.OnVanillaPrefabsAvailable -= CreateAssistantPrefab; } } public class ClearChestsCommand : ConsoleCommand { public override string Name => "limparbaus"; public override string Help => "Apaga o texto (rótulo) de todos os baús na área carregada (Comando do BaseAssistant)."; public override void Run(string[] args) { if ((Object)(object)Player.m_localPlayer == (Object)null) { Logger.LogWarning((object)"Você precisa estar no jogo com um personagem para usar este comando."); return; } int num = 0; Container[] array = Object.FindObjectsOfType(); for (int i = 0; i < array.Length; i++) { ZNetView component = ((Component)array[i]).GetComponent(); if ((Object)(object)component != (Object)null && component.IsValid() && !string.IsNullOrEmpty(component.GetZDO().GetString("text", ""))) { component.ClaimOwnership(); component.GetZDO().Set("text", ""); num++; } } string text = $"[BaseAssistant] {num} baús tiveram seus rótulos apagados com sucesso."; Logger.LogInfo((object)text); if ((Object)(object)Console.instance != (Object)null) { Console.instance.Print(text); } } } public static class PluginInfo { public const string PLUGIN_GUID = "BaseAssistant"; public const string PLUGIN_NAME = "BaseAssistant"; public const string PLUGIN_VERSION = "1.0.0"; } }