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; } } }