NetworkView.Find problem, Unity bug?

Hello,

I have been battling with this error for some time now and I really can’t find the source of its problem.

I am creating a multi player game where the server keeps track of all players and their health. I have some functions that go through all the players, stored in a hashtable, which take or add energy to them.

The problem is so strange that in one function I go through the hashtable without any error and remove their energy. When I use the exact same code on a different function to add energy I always get this error:


View ID AllocatedID: 1 not found during lookup. Strange behaviour may occur
UnityEngine.NetworkView:Find(NetworkViewID)
PlayerStats:SetPlayersEnergy(Int32) (at Assets/Scripts/Player/PlayerStats.cs:514)


For the sake of it, I will share the two functions here and maybe you can help me with it!

This RemoveDailyEnergy is working properly

public void RemoveDailyEnergy()
{

    Debug.Log("RemoveDailyEnergy");
    if (Network.isServer)
    {
        NetworkViewID[] tmpPlayers = new NetworkViewID[players.Count];
        
        players.Keys.CopyTo(tmpPlayers, 0);

        foreach (NetworkViewID player in tmpPlayers)
        {
            Debug.Log("Remove energy: " + player);
            NetworkView tmp = NetworkView.Find(player);

            if ((int)players[player] <= dailyEnergyModifier)
            {

                tmp.RPC("KillPlayer", RPCMode.AllBuffered, player);

                players.Remove(player);
                teams.Remove(player);
                usernames.Remove(player);
            }
            else
            { //remove energy from player

                players[player] = (int)players[player] - dailyEnergyModifier;


                if (tmp.isMine)
                    tmp.gameObject.GetComponent<PlayerHarvestWater>().RemoveEnergy(player, (int)players[player], false);
                else
                    tmp.RPC("RemoveEnergy", player.owner, player, (int)players[player], false);
            }

        }

    }

}

This one isn’t:

public void SetPlayersEnergy(int newEnergy)
{
if (Network.isServer)
{

        initialEnergy = newEnergy;

        NetworkViewID[] tmpPlayers = new NetworkViewID[players.Count];

        players.Keys.CopyTo(tmpPlayers, 0);

        foreach (NetworkViewID player in tmpPlayers)
        {
            Debug.Log("Set energy: " + player);
            try
            {
                NetworkView tmp = NetworkView.Find(player);

                players[player] = newEnergy;

                if (tmp.isMine)
                    tmp.gameObject.GetComponent<PlayerHarvestWater>().AddEnergy(player, (int)players[player]);
                else
                    tmp.RPC("AddEnergy", player.owner, player, (int)players[player]);

            }
            catch (System.Exception e)
            {
                Debug.Log(e.StackTrace);
            }

        }

    }

}

The error happens on this line:

NetworkView tmp = NetworkView.Find(player);

Any help will be really appreciated!!! Thanks (Sorry the formatting, this is going nuts :S)

Ok, somehow got a work around.

So I guess RPC should work on disabled objects but with this case it wasn’t working. I was disabling the player object with the RPC script to access a menu and edit stuff, and when the NetworkView.Find was searching for that ID it just crashed.

At least it should be possible to catch the exception, which wasn’t working either. Maybe this part is Unity’s fault?

Basically, just made a check before Find to see if it was my ID and ignore the find.

Cheers!