Exemple #1
0
    public void ReceiveMessage(MESSAGE RecievedMessage, object[] Args)
    {
        int Sender = Self.GetTree().GetRpcSenderId();

        if (Sender == 0)
        {
            //When Sender it 0 that means that ReciveMessage was called locally
            Sender = Self.GetTree().GetNetworkUniqueId();
        }

        if (Self.GetTree().IsNetworkServer())
        {         //Runs on server, 100% trusted
            switch (RecievedMessage)
            {
            case (MESSAGE.PLAYER_REQUEST_POS): {
                Perform.RemotePlayerMove(Events.INVOKER.SERVER, Sender, (Vector3)Args[0]);
                foreach (int Peer in PeerList)
                {
                    if (Peer != Sender && Peer != Self.GetTree().GetNetworkUniqueId())                            //Don't notify original client or server, both already know
                    {
                        Message.ServerUpdatePlayerPos(Peer, Sender, (Vector3)Args[0]);
                    }
                }
                return;
            }

            case (MESSAGE.PLAYER_REQUEST_ROT): {
                Perform.RemotePlayerRotate(Events.INVOKER.SERVER, Sender, (float)Args[0]);
                foreach (int Peer in PeerList)
                {
                    if (Peer != Sender && Peer != Self.GetTree().GetNetworkUniqueId())                            //Don't notify original client or server, both already know
                    {
                        Message.ServerUpdatePlayerRot(Peer, Sender, (float)Args[0]);
                    }
                }
                return;
            }

            case (MESSAGE.PLACE_REQUEST): {
                Perform.Place(Events.INVOKER.SERVER, (int)Args[0], (Items.TYPE)Args[1], (Vector3)Args[2], (Vector3)Args[3]);
                return;
            }
            }
        }

        switch (RecievedMessage)
        {
        case (MESSAGE.PLAYER_UPDATE_POS): {
            Perform.RemotePlayerMove(Events.INVOKER.CLIENT, (int)Args[0], (Vector3)Args[1]);
            return;
        }

        case (MESSAGE.PLAYER_UPDATE_ROT): {
            Perform.RemotePlayerRotate(Events.INVOKER.CLIENT, (int)Args[0], (float)Args[1]);
            return;
        }

        case (MESSAGE.PEERLIST_UPDATE): {
            PeerList.Clear();
            foreach (int Peer in (int[])(Args[0]))
            {
                PeerList.Add(Peer);
            }
            return;
        }

        default: {
            Console.Log("Invalid message '" + RecievedMessage.ToString() + "'");
            return;
        }
        }
    }