public void AddCar(Player player, Model model, GamePlayView gameplay) { if (model == null) model = Game.Content.Load<Model>(@"Models/porsche"); var car = gameplay.MakeCar(); Cars[player] = car; }
private void UpdateLocalCar(Player player, Car car) { // Calculate real position if (Game.GetService<CameraComponent>().CurrentCamera is ThirdPersonCamera) { //Accelerate car.Speed = Math.Min(car.Speed + (car.Acceleration - car.Speed * 0.00305f) * input.GetState(Input.Thrust) - input.GetState(Input.Brake) * car.Deacceleration, car.MaxSpeed); // Turn Wheel car.WheelRotationY += (input.GetState(Input.Steer) * (car.TurnSpeed - Math.Abs(car.Speed) * 0.00005f)); car.WheelRotationY = MathHelper.Clamp(car.WheelRotationY, -car.MaxWheelTurn, car.MaxWheelTurn); if (Math.Abs(car.WheelRotationY) > .001f) car.WheelRotationY *= .95f; else car.WheelRotationY = 0; } //Friction if is not driving float friction = .995f; if (Math.Abs(input.GetState(Input.Thrust)) < .001f) { car.Speed *= (friction - Math.Abs(car.Speed-car.MaxSpeed) * 0.0005f); } // If in a network game, run parallell simulation of car var serverClient = Game.GetService<ServerClient>(); if (Game.GetService<ServerClient>().connected) { bool isOverThreshold = simulationStrategy.UpdatePosition(player, car); // If car has deviated too much from simulated path, distribute position to server if (isOverThreshold) { //Console.WriteLine(DateTime.Now + ": Local car over threshold, sending update!"); player.SetPosition(car.Position.X, car.Position.Y, car.Position.Z, car.Rotation, car.Speed, (byte)(player.LastReceived.Sequence + 1), DateTime.UtcNow); serverClient.SendPlayerPosition(); } } }
public void RemoveCar(Player player) { Cars.Remove(player); }
/// <summary> /// Update a remote car with dead reckoning. /// </summary> /// <param name="player"></param> /// <param name="car"></param> private void UpdateNetworkCar(Player player, Car car) { car.MaterialDiffuse = player.CarColor; simulationStrategy.UpdatePosition(player, car); }
private void ParseDataPackage(NetIncomingMessage msg) { MessageType type = (MessageType)msg.ReadByte(); Dictionary<byte, Player> PlayerList = ServerHandler.Players; Player player = null; if (IsPlayerMessage(type) && !PlayerList.TryGetValue(msg.ReadByte(), out player)) { //Console.WriteLine("Received message from unknown player, discarding..."); return; } switch (type) { case MessageType.PlayerPos: byte sequenceNo = msg.ReadByte(); float x = msg.ReadFloat(); float y = msg.ReadFloat(); float z = msg.ReadFloat(); float rotation = msg.ReadFloat(); float velocity = msg.ReadFloat(); DateTime sentTime = new DateTime(msg.ReadInt64()); player.SetPosition(x, y, z, rotation, velocity, sequenceNo, sentTime); break; case MessageType.Chat: string chatMsg = msg.ReadString(); Console.WriteLine("CHAT {0}: {1}", player.PlayerName, chatMsg); var chatTuple = new Tuple<string, string, DateTime>(player.PlayerName, chatMsg, DateTime.Now); ServerHandler.ChatHistory.AddLast(chatTuple); break; case MessageType.Debug: break; case MessageType.LobbyUpdate: if (DEBUG_MODE) Console.Write("Received LobbyUpdate message: "); Dictionary<byte, Player> newPlayerList = new Dictionary<byte, Player>(); byte playerCount = msg.ReadByte(); for (int i = 0; i < playerCount; i++) { byte discoveredPlayerId = msg.ReadByte(); string discoveredPlayerName = msg.ReadString(); bool discoveredPlayerReady = msg.ReadBoolean(); Vector3 discoveredPlayerColor = new Color(msg.ReadByte(), msg.ReadByte(), msg.ReadByte()).ToVector3(); if (DEBUG_MODE) Console.Write(discoveredPlayerName + ", "); if (ServerHandler.LocalPlayer.ID != discoveredPlayerId) // ignore info of local player { Player discoveredPlayer; if (!PlayerList.TryGetValue(discoveredPlayerId, out discoveredPlayer)) { ServerHandler.Game.GetService<HUDConsoleComponent>().WriteOutput("New remote player "+discoveredPlayerName+" discovered!"); var newPlayer = new Player(GameManager.GetInstance(), discoveredPlayerId, discoveredPlayerName); newPlayer.State = discoveredPlayerReady ? PlayerState.Game : PlayerState.Lobby; newPlayer.CarColor = discoveredPlayerColor; newPlayerList[discoveredPlayerId] = newPlayer; } else { discoveredPlayer.PlayerName = discoveredPlayerName; // maybe has changed name discoveredPlayer.CarColor = discoveredPlayerColor; // or color discoveredPlayer.State = discoveredPlayerReady ? PlayerState.Game : PlayerState.Lobby; newPlayerList[discoveredPlayerId] = discoveredPlayer; PlayerList.Remove(discoveredPlayerId); } } ServerHandler.Players = newPlayerList; } // Remaining players in PlayerList are no longer connected to server. foreach (var disconnectedPlayer in PlayerList.Values) { ServerHandler.Game.GetService<HUDConsoleComponent>().WriteOutput("Player "+disconnectedPlayer.PlayerName+" disconnected!"); var ccc = ServerHandler.Game.GetService<CarControlComponent>(); if (ccc != null) ccc.RemoveCar(disconnectedPlayer); } if (DEBUG_MODE) Console.WriteLine(); break; case MessageType.OK: byte assignedID = msg.ReadByte(); int gameSeed = msg.ReadInt32(); if (DEBUG_MODE) Console.WriteLine("Received OK handshake from server with ID: "+assignedID+", seed: "+gameSeed); ServerHandler.LocalPlayer.ID = assignedID; ServerHandler.Seed = gameSeed; ServerHandler.connected = true; ServerHandler.Game.GetService<HUDConsoleComponent>().WriteOutput("Connected! (id "+assignedID+")"); break; case MessageType.Countdown: byte countdown = msg.ReadByte(); if (DEBUG_MODE) Console.WriteLine("Received Countdown from server: " + countdown); string[] countdownStr = { "3", "2", "1", "Go!" }; ServerHandler.Game.GetService<HUDComponent>().ShowTextNotification(Color.AliceBlue, countdownStr[countdown], TimeSpan.FromSeconds(0.8)); ServerHandler.GamePlay.mode.CountDownState = countdown; if (countdown == 3) ServerHandler.GamePlay.mode.GameStarted = true; break; case MessageType.RaceTime: player.RaceTime = new TimeSpan(msg.ReadInt64()); break; default: break; } }