/// <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); } }
/// <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); } } }
/// <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; } } }
public MessageData(Message m, int ci, GameChannelType gameChannelType) { this.m = m; clientIndex = ci; channelType = gameChannelType; }
/// <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); }