private static void UpdateWorld(bool firstRun = false)
        {
            lock (UpdatingWorld)
            {
                Command((connect) =>
                {
                    //собираем пакет на сервер
                    var toServ = new ModelPlayToServer()
                    {
                        UpdateTime = Data.UpdateTime, //время прошлого запроса
                    };
                    //данные сохранения игры
                    if (Data.SaveFileData != null)
                    {
                        toServ.SaveFileData = Data.SaveFileData;
                        Data.SaveFileData   = null;
                    }

                    //собираем данные с планеты
                    if (!firstRun)
                    {
                        UpdateWorldController.SendToServer(toServ);
                    }

                    //запрос на информацию об игроках. Можно будет ограничить редкое получение для тех кто оффлайн
                    if (Data.Chats != null && Data.Chats[0].PartyLogin != null)
                    {
                        toServ.GetPlayersInfo = Data.Chats[0].PartyLogin;
                    }

                    //отправляем на сервер, получаем ответ
                    ModelPlayToClient fromServ = connect.PlayInfo(toServ);
                    Loger.Log("Client " + My.Login + " UpdateWorld "
                              + string.Format("Отпр. свои {0}, своиDel {1}{5}. Пришло {2}, del {3}, посылок {4}"
                                              , toServ.WObjects == null ? 0 : toServ.WObjects.Count
                                              , toServ.WObjectsToDelete == null ? 0 : toServ.WObjectsToDelete.Count
                                              , fromServ.WObjects == null ? 0 : fromServ.WObjects.Count
                                              , fromServ.WObjectsToDelete == null ? 0 : fromServ.WObjectsToDelete.Count
                                              , fromServ.Mails == null ? 0 : fromServ.Mails.Count
                                              , toServ.SaveFileData == null || toServ.SaveFileData.Length == 0 ? "" : ", сейв"
                                              ));

                    //сохраняем время актуальности данных
                    Data.UpdateTime = fromServ.UpdateTime;

                    //обновляем информацию по игрокам
                    if (fromServ.PlayersInfo != null && fromServ.PlayersInfo.Count > 0)
                    {
                        foreach (var pi in fromServ.PlayersInfo)
                        {
                            if (pi.Login == null)
                            {
                                continue;
                            }
                            if (Data.Players.ContainsKey(pi.Login))
                            {
                                Data.Players[pi.Login] = new PlayerClient()
                                {
                                    Public = pi
                                }
                            }
                            ;
                            else
                            {
                                Data.Players.Add(pi.Login, new PlayerClient()
                                {
                                    Public = pi
                                });
                            }
                        }
                    }
                    var allWObjects = Find.WorldObjects.AllWorldObjects
                                      .Where(o => o is CaravanOnline)
                                      .Select(o => o as CaravanOnline)
                                      .ToList();
                    foreach (var pi in Data.Players)
                    {
                        pi.Value.WObjects = allWObjects.Where(wo => wo.OnlinePlayerLogin == pi.Key).ToList();
                    }

                    //обновляем планету
                    UpdateWorldController.LoadFromServer(fromServ);
                });
            }
        }
        private static void UpdateWorld(bool firstRun = false)
        {
            lock (UpdatingWorld)
            {
                Command((connect) =>
                {
                    //собираем пакет на сервер
                    var toServ = new ModelPlayToServer()
                    {
                        UpdateTime = Data.UpdateTime, //время прошлого запроса
                    };
                    //данные сохранения игры
                    if (Data.SaveFileData != null)
                    {
                        toServ.SaveFileData = Data.SaveFileData;
                        toServ.SingleSave   = Data.SingleSave;
                        Data.SaveFileData   = null;
                    }

                    //собираем данные с планеты
                    if (!firstRun)
                    {
                        UpdateWorldController.SendToServer(toServ);
                    }

                    if (firstRun)
                    {
                        GetPlayersInfoCountRequest = 0;
                    }

                    //запрос на информацию об игроках. Можно будет ограничить редкое получение для тех кто оффлайн
                    if (Data.Chats != null && Data.Chats[0].PartyLogin != null)
                    {
                        if (Data.Players == null || Data.Players.Count == 0 ||
                            GetPlayersInfoCountRequest % 5 == 0)
                        {
                            //в начале и раз в пол минуты (5 сек между UpdateWorld * 5) получаем инфу обо всех
                            toServ.GetPlayersInfo = Data.Chats[0].PartyLogin;
                        }
                        else
                        {
                            //в промежутках о тех кто онлайн
                            toServ.GetPlayersInfo = Data.Players.Values.Where(p => p.Online).Select(p => p.Public.Login).ToList();
                        }
                        GetPlayersInfoCountRequest++;
                        //Loger.Log("Client " + My.Login + " UpdateWorld* " + (toServ.GetPlayersInfo.Count.ToString())
                        //    + " " + (toServ.GetPlayersInfo.Any(p => p == SessionClientController.My.Login) ? "1" : "0"));
                    }

                    //отправляем на сервер, получаем ответ
                    ModelPlayToClient fromServ = connect.PlayInfo(toServ);

                    //Loger.Log("Client UpdateWorld 5 ");
                    Loger.Log("Client " + My.Login + " UpdateWorld "
                              + string.Format("Отпр. свои {0}, своиDel {1}{5}. Пришло {2}, del {3}, игроков {8}, посылок {4}{6}{7}"
                                              , toServ.WObjects == null ? 0 : toServ.WObjects.Count
                                              , toServ.WObjectsToDelete == null ? 0 : toServ.WObjectsToDelete.Count
                                              , fromServ.WObjects == null ? 0 : fromServ.WObjects.Count
                                              , fromServ.WObjectsToDelete == null ? 0 : fromServ.WObjectsToDelete.Count
                                              , fromServ.Mails == null ? 0 : fromServ.Mails.Count
                                              , toServ.SaveFileData == null || toServ.SaveFileData.Length == 0 ? "" : ", сейв"
                                              , fromServ.AreAttacking ? " Атакуют!" : ""
                                              , fromServ.NeedSaveAndExit ? " Команда на отключение" : ""
                                              , fromServ.PlayersInfo == null ? "null" : fromServ.PlayersInfo.Count.ToString()
                                              ));

                    //сохраняем время актуальности данных
                    Data.UpdateTime = fromServ.UpdateTime;
                    if (!string.IsNullOrEmpty(fromServ.KeyReconnect))
                    {
                        Data.KeyReconnect = fromServ.KeyReconnect;
                    }

                    //обновляем информацию по игрокам
                    if (fromServ.PlayersInfo != null && fromServ.PlayersInfo.Count > 0)
                    {
                        foreach (var pi in fromServ.PlayersInfo)
                        {
                            if (pi.Login == null)
                            {
                                continue;
                            }
                            Data.Players[pi.Login] = new PlayerClient()
                            {
                                Public = pi
                            };
                            if (pi.Login == My.Login)
                            {
                                My        = pi;
                                Data.MyEx = Data.Players[pi.Login];
                                //Loger.Log("Client " + My.Login + " UpdateWorld* " + My.LastOnlineTime.ToString("o") + " " + DateTime.UtcNow.ToString("o")
                                //   + " " + (toServ.GetPlayersInfo.Any(p => p == My.Login) ? "1" : "0"));
                            }
                        }
                    }

                    //обновляем планету
                    UpdateWorldController.LoadFromServer(fromServ, firstRun);

                    //обновляем инфу по поселениям
                    var allWObjects = Find.WorldObjects.AllWorldObjects
                                      .Select(o => o as CaravanOnline)
                                      .Where(o => o != null)
                                      .ToList();
                    foreach (var pi in Data.Players)
                    {
                        if (pi.Value.Public.Login == My.Login)
                        {
                            continue;
                        }
                        pi.Value.WObjects = allWObjects.Where(wo => wo.OnlinePlayerLogin == pi.Key).ToList();
                    }

                    //Сохраняем и выходим
                    if (fromServ.NeedSaveAndExit)
                    {
                        if (!SessionClientController.Data.BackgroundSaveGameOff)
                        {
                            SessionClientController.SaveGameNow(false, () =>
                            {
                                SessionClientController.Disconnected("OCity_SessionCC_Shutdown_Command_ProgressSaved".Translate());
                            });
                        }
                        else
                        {
                            SessionClientController.Disconnected("OCity_SessionCC_Shutdown_Command".Translate());
                        }
                    }

                    //если на нас напали запускаем процесс
                    if (fromServ.AreAttacking && GameAttackHost.AttackMessage())
                    {
                        GameAttackHost.Get.Start(connect);
                    }
                });
            }
        }