public void HandleTrainSync(TrainSyncRpc rpc) { for (int i = 0; i < rpc.TrainCount; i++) { string[] carData = rpc.TrainCars[i].Split("-"); RailcarModel[] models = new RailcarModel[carData.Length]; for (int j = 0; j < carData.Length; j++) { models[j] = Models[int.Parse(carData[j])]; } Train train; if (i >= Trains.Count) { train = new Train(this, models[i], TrackPosition.FromString(this, rpc.TrainPositions[i])); for (int j = 1; j < models.Length; j++) { train.AddRailcar(models[j]); } } else { train = (Train)Trains[i]; } train.UpdatePosition(TrackPosition.FromString(this, rpc.TrainPositions[i])); train.Speed = rpc.TrainSpeeds[i]; train.Acceleration = rpc.TrainAccelerations[i]; } for (int i = 0; i < rpc.SwitchInfo.Length; i++) { Switches[i].SwitchPosition = rpc.SwitchInfo[i]; } }
private void OnRailPulse(object sender, ElapsedEventArgs e) { int currentTick = GameServer.TickCount; float dt = (float)(currentTick - lastSyncTick) / 1000; lastSyncTick = currentTick; TrainSyncRpc syncPacket = new TrainSyncRpc(Trains.Count, Switches.Count); int c = 0; foreach (Train train in Trains) { // Update the position train.Move(dt); // Prepare the data syncPacket.TrainSpeeds[c] = train.Speed; syncPacket.TrainAccelerations[c] = train.Acceleration; syncPacket.TrainPositions[c] = train.FrontPosition.ToString(); string trainCarsString = ""; foreach (SharedRailcar car in train.Railcars) { trainCarsString = trainCarsString + car.Model.Id + "-"; } syncPacket.TrainCars[c] = trainCarsString.Remove(trainCarsString.Length - 1); c++; } c = 0; foreach (TrackSwitch s in Switches) { syncPacket.SwitchInfo[c] = s.SwitchPosition; c++; } // Send the rpc to all clients RpcManager.Instance.TriggerRPC("trainSyncRpc", syncPacket); }