jpw1991 / chebs-necromancy

Cheb's Necromancy adds Necromancy to Valheim via craftable wands and structures. Minions will follow you, guard your base, and perform menial tasks.
The Unlicense
10 stars 4 forks source link

Null object but with 100+ mods installed #92

Closed jpw1991 closed 1 year ago

jpw1991 commented 1 year ago

Describe the bug

image

Null object reported by user with over 100 mods installed.

Code review to spot maybe where it occurs? I can't see it

        private void Update()
        {
            if (ZNet.instance == null || !(Time.time > lastUpdate)) return;
            if (ReturnHome())
            {
                dropoffTarget = GetNearestDropOffPoint();
                if (dropoffTarget == null)
                {
                    NeckroStatus = "Can't find a container";
                }
                else
                {
                    NeckroStatus = $"Moving toward {dropoffTarget.name}";
                    if (CloseToDropoffPoint())
                    {
                        DepositItems();
                    }
                }
            }
            else
            {
                LookForNearbyItems();
                PickupNearbyItems();
                //todo: loot dead gatherers
            }

            if (ShowMessages.Value
                && NeckroStatus != ""
                && Vector3.Distance(Player.m_localPlayer.transform.position, transform.position) < 5)
            {
                Chat.instance.SetNpcText(gameObject, Vector3.up, 5f, 2f, "", NeckroStatus, false);   
            }

            lastUpdate = Time.time + UpdateDelay.Value;
        }

        private void LookForNearbyItems()
        {
            // get all nearby items
            Collider[] hitColliders = Physics.OverlapSphere(transform.position + Vector3.up, LookRadius.Value, autoPickupMask);
            if (hitColliders.Length < 1) return;
            // order items from closest to furthest, then take closest one
            Collider closest = hitColliders
                .OrderBy(col => Vector3.Distance(transform.position, col.transform.position))
                .FirstOrDefault();
            if (closest != null)
            {
                ItemDrop itemDrop = closest.GetComponentInParent<ItemDrop>();
                if (itemDrop != null)
                {
                    if (TryGetComponent(out MonsterAI monsterAI))
                    {
                        // move toward that item
                        NeckroStatus = $"Moving toward {itemDrop.m_itemData.m_shared.m_name}";
                        monsterAI.SetFollowTarget(itemDrop.gameObject);
                        return;
                    }
                }
            }
        }

        private void PickupNearbyItems()
        {
            List<string> itemNames = new();
            Collider[] hitColliders = Physics.OverlapSphere(transform.position + Vector3.up, PickupRadius.Value, autoPickupMask);
            foreach (var hitCollider in hitColliders)
            {
                ItemDrop itemDrop = hitCollider.GetComponentInParent<ItemDrop>();
                if (itemDrop != null)
                {
                    if (itemDrop.CanPickup())
                    {
                        itemNames.Add(itemDrop.m_itemData.m_shared.m_name);
                        StoreItem(itemDrop, container);
                    }
                }
            }

            NeckroStatus = itemNames.Count > 0
                ? $"Picking up {string.Join(", ", itemNames)}"
                : "Looking for items...";
        }
jpw1991 commented 1 year ago

I think I found and fixed this. It was happening before the game properly loaded because

            if (ShowMessages.Value
                && NeckroStatus != ""
                && Vector3.Distance(Player.m_localPlayer.transform.position, transform.position) < 5)

did not check if localPlayer is null or not.