Ejemplo n.º 1
0
 /// <summary>
 /// Send network message to server
 /// </summary>
 /// <param name="channelType">Reliable or Unreliable. Note: `GameChannelType`</param>
 /// <param name="message"></param>
 public void SendMessage(GameChannelType channelType, Message message)
 {
     if (_client.IsConnected)
     {
         _client.SendMessage((int)channelType, message);
     }
 }
Ejemplo n.º 2
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="channelType"></param>
 /// <param name="message"></param>
 public void SendAll(GameChannelType channelType, Message message)
 {
     for (int i = 0; i < yojimbo.MaxClients; i++)
     {
         if (_server.IsClientConnected(i))
         {
             _server.SendMessage(i, (int)channelType, message);
         }
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// Processes player hit. In order to do that it resimulate old state and checks intersections
        /// Between ball and player.
        /// </summary>
        /// <param name="clientIndex"></param>
        /// <param name="channelType"></param>
        /// <param name="message"></param>
        private void ProcessPlayerHit(int clientIndex, GameChannelType channelType, PlayerHit message)
        {
            foreach (var player in State.Players)
            {
                if (player.playerId == message.PlayerId)
                {
                    var ball         = State.Ball;
                    var ballCenter   = ball.center;
                    var playerCenter = player.center;
                    if (message.StateId != State.StateId)
                    {
                        yojimbo.printf(yojimbo.LOG_LEVEL_INFO, $"State id is not equal M: {message.StateId} S: {State.StateId}\n");
                    }

                    // Searching exact state, namely Server Lag compensation.
                    for (var i = StateHistory.Count - 1; i >= 0; i--)
                    {
                        if (StateHistory[i].StateId == message.StateId)
                        {
                            yojimbo.printf(yojimbo.LOG_LEVEL_INFO, $"Found exact time in state {message.StateId} index {i}\n");
                            ball       = StateHistory[i].Ball;
                            ballCenter = StateHistory[i].Ball.center;
                            foreach (var p in StateHistory[i].Players)
                            {
                                if (p.playerId == message.PlayerId)
                                {
                                    playerCenter = p.center;
                                    break;
                                }
                            }

                            break;
                        }
                    }


                    ballCenter[2]   = 0;
                    playerCenter[2] = 0;
                    // Check distance between ball and player in that old state.
                    var distance = (ballCenter - playerCenter).magnitude;
                    if (distance <= ball.radius + player.radius)
                    {
                        // Update real ball!
                        yojimbo.printf(yojimbo.LOG_LEVEL_INFO,
                                       $"Player hit {clientIndex} {message.PlayerId} {message.Direction} old {State.Ball.direction}\n");
                        State.Ball.direction = message.Direction;
                    }

                    break;
                }
            }
        }
Ejemplo n.º 4
0
 public MessageData(Message m, int ci, GameChannelType gameChannelType)
 {
     this.m      = m;
     clientIndex = ci;
     channelType = gameChannelType;
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Notifies game logic with new coming messages.
 /// </summary>
 /// <param name="channelType"></param>
 /// <param name="message"></param>
 private void ProcessMessage(GameChannelType channelType, Message message)
 {
     _action?.Invoke(message);
 }