На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2018 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


msm.ru
! Предназначение данного раздела
Данный раздел предназначен для публикации уроков и примеров по разработке компьютерных игр любого сорта, в том числе авторских проектов участников нашего форума. Главное условие публикации: необходимо не только выложить свое творение, но и подробно описать процесс его создания, подводные камни и прочие, интересные для собрата-разработчика, вкусности.

Если вы желаете выложить свой проект - пишите в Общеорганизационную тему. Есть какие-то другие вопросы по делу - туда же.

Модераторы: Da$aD
  
> [MMORPG своими руками] 3 Техническая демоверсия, пункты: 3.6
    3.6 Авторизация и аутентификация

    Аутентификация клиента на сервере осуществляется с помощью механизма сессий. После авторизации в сессию записывает id пользователя, для работы с его данными в БД, и кеширует другие необходимые данные. При обращении клиента уже к "рабочему" скрипту, тот уже знает, кто на том конце провода.

    Но тут возникает проблема. Например, игрок путешествует по лабиринту, патроны на исходе, а место попалось вкусное. Чтобы прикупить новые - надо попасть в магазин в городе. Но для этого придется выйти из лабиринта, а значит при повторном входе игрок потеряет прогресс прохождения. Ушлый игрок, используя взломанный клиент/сторонную программу, вызывает скрипт магазина напрямую, а после этого продолжает свое путешествие по лабиринту. Чтобы этого избежать, мы в таблице игрока в БД введем поле "состояние", которые указывает: где сейчас "находится" игрок, и при каждом вызове скрипта будем проверять, а можно ли ему в данный момент выполняться.

    Данный механизм поможет нам и в другом случае. Если произошел сбой ("упал" клиент или система, отключили свет и прочее), то при старте новой сессии на новом экземпляре клиента игрок спокойно продолжит свое движение с того места на котором он остановился. Скрипт авторизации передаст клиенту нужные данные и игра продолжится. Это также удобно, если игрок решил сделать паузу и оставить дальнейшее прохождение лабиринта на завтра. Т.е. при авториазции после успещной загрузки данных из БД мы получаем свитч, который выдает ответ (т.е. переход к целевому модулю в зависимости от состояния).

    ExpandedWrap disabled
      switch($_SESSION['state'])
          {
              case 1:
                  $writer = startAnswer('MainMenu');
                  $writer->text($_SESSION['name']);
                  sendAnswer($writer);
                  break;
              // ...
              default:
                  $state = $_SESSION['state'];
                  setState(1);
                  abortExecution("unknown user state: ".$state);
                  break;
          }

    Для работы с машиной состояний в ядре используются две функции.
    ExpandedWrap disabled
      function checkState($valid_state)
      {
          $cur_state = $_SESSION['state'];
          if($cur_state != $valid_state)
              abortExecution("incorrect user state");
      }
       
      function setState($new_state)
      {
          $_SESSION['state'] = $new_state;
          mysql_query("UPDATE user_data SET state = '$new_state' WHERE = '$id' ");
          
      }


    При этом все рабочие состояни начинаются с 1, т.к. 0 - это значение переменной по умолчанию, т.е. означает, что пользователь пытается получить доступ к скрипту неавторизировавшись.

    Отправка запроса на авторизацию клиентом:
    ExpandedWrap disabled
              Properties prop = new Properties();
              prop.setProperty("login", MailTextField.getText());
              prop.setProperty("pass", new String(PassTextField.getPassword()));
              ClientCore.httpRequest("scripts/login.php", prop);
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script Execution time: 0,0654 ]   [ 20 queries used ]   [ Generated: 20.01.18, 23:07 GMT ]