Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 11
  1. #1
    Аватар для Betta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2017
    Сообщений
    20
    Репутация:
    0 ±

    Автоматическое переподключение игроков после рестарта сервера.

    Приветствую. У меня возникла небольшая проблема. Я делал систему перезагрузки сервера таким образом, чтобы после нее (перезагрузки) игроки автоматически переподключались на сервер и им не приходилось перезапускать клиент. Суть проблемы в том, что когда происходит перезагрузка, мой клиент переподключает быстрее, чем мод успевает подключиться к базе данных MYSQL, хотя код подключения к базе находится в самом начале паблика OnGameModeInit. Кикает с причиной "сервер недоступен" так как он еще не успел прогрузиться. Собственно вопрос, можно ли как-то поставить задержку на переподключение клиента с самого сервера? Ведь на адванс-рп во время рестарта игроков не отключает. Или там это происходит из-за того, что между игроком и сервером есть задержка, за которую сервер успевает загрузить все данные из базы данных, а у меня её нет, потому что я захожу на локальный сервер?

    Вот лог:
    [20:10:41] - Reload
    [20:10:53] - Kicked M: [0]
    [20:10:53] - Подключение к базе данных выполнено

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Betta Посмотреть сообщение
    Ведь на адванс-рп во время рестарта игроков не отключает. Или там это происходит из-за того, что между игроком и сервером есть задержка, за которую сервер успевает загрузить все данные из базы данных, а у меня её нет, потому что я захожу на локальный сервер?
    Так может быть там и нет переподключения к БД при рестарте? Можно сохранить хендл подключения в чём-то, что сервер SA-MP не обнуляет/удаляет при перезагрузке мода (т.е. точно не в обычные переменные или PVar'ы, на счёт SVar'ов точно не помню). Например, использовать стандартные функции setproperty, getproperty, existproperty и deleteproperty: с помощью setproperty сохранить хендл подключения в свойстве "db_handle", затем при загрузке сервера с помощью existproperty проверить, существует ли свойство "db_handle" - если да, то был именно рестарт сервера, а не простой запуск, и вместо того, чтобы подключаться заново к БД, нужно достать сохранённый хендл ещё действительного подключения с помощью getproperty и удалить свойство "db_handle" с помощью deleteproperty, чтобы не занимало лишнее место в памяти.

    P.S.: Сам с MySQL не работал, но надеюсь, вам хватит примеров кода из статей по ссылкам выше.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  3. #3
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Можно ещё хранить в Redis, но нужно, чтобы Redis был установлен на сервере.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  4. #4
    Аватар для vasyok28
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.08.2015
    Сообщений
    106
    Репутация:
    8 ±
    Рестар каким образом реализовал? У меня допустим во время рестарта крашу мод и хост его поднимает, и так я решил твою проблему, тут еще от хоста зависит через какое время будет поднимать серв

  5. #5
    Аватар для Hecf
    Пользователь

    Статус
    Оффлайн
    Регистрация
    21.07.2017
    Сообщений
    46
    Репутация:
    0 ±
    /rcon gmx сила

  6. #6
    Аватар для StevenH
    Пользователь

    Статус
    Оффлайн
    Регистрация
    13.10.2015
    Сообщений
    516
    Репутация:
    21 ±
    Цитата Сообщение от Hecf Посмотреть сообщение
    /rcon gmx сила
    Не решает проблему данной темы

  7. #7
    Аватар для Betta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2017
    Сообщений
    20
    Репутация:
    0 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Так может быть там и нет переподключения к БД при рестарте? Можно сохранить хендл подключения в чём-то, что сервер SA-MP не обнуляет/удаляет при перезагрузке мода (т.е. точно не в обычные переменные или PVar'ы, на счёт SVar'ов точно не помню). Например, использовать стандартные функции setproperty, getproperty, existproperty и deleteproperty: с помощью setproperty сохранить хендл подключения в свойстве "db_handle", затем при загрузке сервера с помощью existproperty проверить, существует ли свойство "db_handle" - если да, то был именно рестарт сервера, а не простой запуск, и вместо того, чтобы подключаться заново к БД, нужно достать сохранённый хендл ещё действительного подключения с помощью getproperty и удалить свойство "db_handle" с помощью deleteproperty, чтобы не занимало лишнее место в памяти.

    P.S.: Сам с MySQL не работал, но надеюсь, вам хватит примеров кода из статей по ссылкам выше.

    А в этом случае данные из баз, к примеру, домов, автомобилей и т. д. успеют загрузится? Не случился ли такого, что переподключившийся игрок введет пароль и окажется в нулевых координатах из-за того, что его дом не прогрузился? Либо если произойдет ошибка на хостинге, в следствии чего будет утеряна связь с базой данных - сервер все равно будет продолжать слать запросы к ней а игроки будут заходить на сервер, где ничего не загружено? В теории такая реализация не выглядит надежно, но я ,возможно, чего-нибудь да не учитываю.

    - - - Добавлено - - -

    Цитата Сообщение от $continue$ Посмотреть сообщение
    Можно ещё хранить в Redis, но нужно, чтобы Redis был установлен на сервере.
    Хм, может пригодиться. Спасибо за такую штучку.

    - - - Добавлено - - -

    Цитата Сообщение от vasyok28 Посмотреть сообщение
    Рестар каким образом реализовал? У меня допустим во время рестарта крашу мод и хост его поднимает, и так я решил твою проблему, тут еще от хоста зависит через какое время будет поднимать серв
    Через OnGameModeExit.

    - - - Добавлено - - -

    Изначально у меня была идея с перехватом паблика подключения игрока с проверкой на рестарт, после чего посредством таймера заставлять его немного подождать, секунд скажем 3-5. Чем может быть плох такой вариант?
    Последний раз редактировалось Betta; 20.08.2017 в 17:28.

  8. #8
    Аватар для vasyok28
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.08.2015
    Сообщений
    106
    Репутация:
    8 ±
    Почему не сделать при подключение игрока на сервер проверку если сервер соединился с базой данных тогда выводим диалог авторизации/регистрации иначе диалог с сообщением "Пожалуйста подождите идет настройка игрового режима" и потом через несколько секунд дать диалог авторизации/регистарции, элементарные вещи в павн

  9. #9
    Аватар для Betta
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.08.2017
    Сообщений
    20
    Репутация:
    0 ±
    Решил все же использовать таймер, чтобы дать время на загрузку, а после уже продолжать подключение игрока. А способом Даниэля воспользовался для определения того, что произошел рейстарт, ведь кроме автоматического в определенный момент, сервер могут перезагружать администраторы. Всем спасибо.
    Последний раз редактировалось Betta; 21.08.2017 в 23:49.

  10. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Возможно, немного поздно, но всё же.

    Цитата Сообщение от Betta Посмотреть сообщение
    А в этом случае данные из баз, к примеру, домов, автомобилей и т. д. успеют загрузится?
    Зависит чисто от вас и вашего кода. Если всё сделать грамотно (например, не загружать каждый дом отдельным запросом), то можно успеть всё прогрузить, пока игрок вводит пароль. Тем более, если вы поняли основную идею из моего предыдущего поста, вам не нужно будет даже ждать, пока сервер подключится заново к БД - вы будете использовать соединение, которое было создано ещё до рестарта.

    Цитата Сообщение от $continue$ Посмотреть сообщение
    Можно ещё хранить в Redis, но нужно, чтобы Redis был установлен на сервере.
    Хотелось бы увидеть хоть один крупный российский хостинг для SA-MP, на котором поддерживается Redis.

    Цитата Сообщение от $continue$ Посмотреть сообщение
    Изначально у меня была идея с перехватом паблика подключения игрока с проверкой на рестарт, после чего посредством таймера заставлять его немного подождать, секунд скажем 3-5. Чем может быть плох такой вариант?
    Дайте игроку ввести пароль - за это время данные о домах, машинах и т.д. уже могут успеть загрузиться. Если не успеют, заставляйте игрока ждать перед загрузкой всех данных его аккаунта.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •