Русское сообщество по скриптингу

Взаимодействие PHP и сервера

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Взаимодействие PHP и сервера

Сообщение BaJIeHoK » 27 май 2014, 05:03

Приветствую пользователи amx-x
В данной статье я попытаюсь рассказать о взаимодействие php и сервера

Данная статья рассчитана для тех, кто имеет хоть какое-то предоставление о php
Мы разберем пример без использование mysql.

Решил написать с той целью, что самому потребовалось создать быстренькую форму выдачи доната игроку.

Расскажу принцип:
Предположим у вас на сервере есть некая валюта, способность и т.д. Вам пишут пользователи, чтобы это преобрести. Совершив оплату вам разумеется её надо выдать, но ведь это так долго: открыть кс => зайти на сервер( а сервер полон ) => а ведь лень или вы сильно заняты и лень отрываться.

В общем суть такая - выбрать игрока с вебформы и передать некую команду на сервер.
Разумеется можно всё реализовать с помощью mysql, но чекать каждые 10 секунд к примеру базу оптимальным решением не назвать.

Приступаем
Для начала создадим файл index.php и запишем туда следующее
[pawn]
  1. <?php

  2.         include ("rcon_hl_net.inc"); //Подключаем inc опроса сервера

  3.  

  4.         $server_ip              =       "192.168.0.1";         //IP сервера

  5.         $server_port            =       "27015";                        //Порт сервера

  6.         $server_rcon            =      "123456";                   //Ркон пароль сервера

  7.  

  8.         function ServerPlayers($server_ip, $server_port, $server_rcon) //Функция получение ников игроков

  9.         {

  10.                 $server = new Rcon(); //Создаем класс работы с rcon

  11.                 $server->Connect($server_ip, $server_port, $server_rcon); //Подключаемся к серверу

  12.  

  13.                 $info = $server->Info(); //Пробуем получить информацию о сервере

  14.  

  15.                 if($info) //Если информация есть

  16.                 {

  17.                         $players = $server->Players(); //Получаем массив с данными

  18.                 }else{

  19.                         echo 'Сервер недоступен'; //Выводим сообщение

  20.  

  21.                         $server->disconnect(); //Закрываем соединение с сервером

  22.                         exit; //Заканчиваем работу

  23.                 }

  24.  

  25.                 $server->disconnect(); //Закрываем соединение с сервером

  26.                 return $players; //Возвращаем массив с данными дальше

  27.         }

  28.  

  29.         function SetPlayers($server_ip, $server_port, $server_rcon, $nick, $num) //Функция получение ников игроков

  30.         {

  31.                 $server = new Rcon(); //Создаем класс работы с rcon

  32.                 $server->Connect($server_ip, $server_port, $server_rcon); //Подключаемся к серверу

  33.  

  34.                 $command = "php_setplayer ".$nick." ".$num.""; //Формируем команду для отправки

  35.                 $result = $server->RconCommand( $command ); //Отправляем команду

  36.                 $server->Disconnect(); //Закрываем соединение с сервером

  37.  

  38.                 return $result;

  39.         }

  40.  

  41.         if(isset($_POST['player'])) //Если передан ник

  42.         {

  43.                 $result = SetPlayers($server_ip, $server_port, $server_rcon, $_POST['player'], $_POST['num']); //Отправляем команду на сервер

  44.  

  45. echo $result; //Выводим результат работы

  46.                 if(!$result)

  47.                 {

  48.                         echo 'Что-то не так :(';

  49.                         exit;

  50.                 }

  51.         }else{ //Иначе

  52.                 $server_info = ServerPlayers($server_ip, $server_port, $server_rcon); //Получаем инфу

  53.  

  54.                 echo '<form action="/index.php" method="post">'; //Создаем тег для обмена данных

  55.                 echo 'Игроки: <select name="player">'; //Создаем листбокс

  56.                         foreach($server_info as $v) //Прогоняем массив через цикл

  57.                         {

  58.                                 echo '<option value="'.$v[name].'">'.$v[name].'</option>'; //Добавляем ник в бокс

  59.                         }

  60.                 echo '</select><br>'; //Закрываем тег

  61.  

  62.                 echo 'Сколько передать: <input type="text" name="num"><br>';

  63.                 echo '<input type="submit" value="Передать">';

  64.                 echo '</form>'; //Закрываем тег

  65.         }

  66. ?>
[/pawn]

В итоге на сайте получаем листбокс с никами игроков и полем с вводом передаваемого числа. Всё предельно просто, без наворотов. Дизайн прикрутить и всякие плюхи никто не запрещает - это нам сейчас не нужно
1.JPG


Как вы заметили - подключается класс rcon_hi_net - качаем его здесь, ложим рядом
rcon_hl_net.rar


Здесь стоит обратить внимание на
$command = "php_setplayer ".$nick." ".$num.""; //Формируем команду для отправки

Как видите мы будем посылать команду php_setplayer, которую вам потребуется заменить на свою, а то может случится так, что какой-нибудь "умный" человек поймет, что здесь используется этот способ и будет фармить себе бесконечное кол-во вашего значения

Такс, ну в вебчастью закончили - сейчас переходим к плагину.

Создаем чистый sma и кидаем туда
[pawn]
  1. #include <amxmodx>

  2. #include <amxmisc>

  3.  

  4. #define PLUGIN  "[TUT]PHP and Server(amx-x)"

  5. #define VERSION         "1.0"

  6. #define AUTHOR  "BaJIeHoK"

  7.  

  8. public plugin_init()

  9. {

  10.         register_plugin(PLUGIN, VERSION, AUTHOR)

  11. }
[/pawn]

Нам не потребуется никаких модулей.
Первым делом нам надо создать обработку той самой команды, на которую мы и будем опираться.
[pawn]
  1. register_concmd("php_serverplayer", "AddPlayerNum")
[/pawn]

Не забывайте, что если вы сменили команду в php обработчике, то поменяйте её и здесь :-D

Теперь создадим непосредственно обработчик приходящих данных - функцию AddPlayerNum
[pawn]
  1. public AddPlayerNum()

  2. {

  3.         new szResult[32] //Сюда запишем, что передадим обработчику php

  4.  

  5.         new szParseName[64] //Сюда запишем ник, который пришел

  6.         new szParseNum[10] //А сюда запишем число, которое пришло

  7.  

  8.         read_argv(1, szParseName, charsmax( szParseName )) //Получаем ник

  9.         read_argv(2, szParseNum, charsmax( szParseNum )) //Получаем число

  10.  

  11.         new id = find_player("a", szParseName) //Ведем поиск по нику

  12.  

  13.         if(id) //Если игрок найден

  14.         {

  15.                 iPlayerNum[id] += str_to_num( szParseNum ) //Присваиваем число игроку

  16.                 formatex(szResult, charsmax( szResult ), "It's okay") //Передаем, что всё окей

  17.  

  18.                 client_print(id, print_chat, "Your number supplemented by %d units. Only %d", str_to_num( szParseNum ), iPlayerNum[id]) // Выводим сообщение о том, что ему было передано число и сколько всего у него того или иного

  19.         }else{

  20.                 formatex(szResult, charsmax( szResult ), "Player not found") //Передаем, что игрок не найден - видимо вышел =)

  21.         }

  22.         server_print("%s", szResult) //Отправляем в консоль сервера то, что нужно передать обработчику

  23.         return PLUGIN_HANDLED //Чтобы ошибку не выбивало, что команды нет

  24. }
[/pawn]

И последний шаг - создаем массив для хранение чисел. В вашем случаи может быть натив ну и так далее.
[pawn]
  1. new iPlayerNum[33]
[/pawn]

Результат работы плагина
2.JPG

2014-05-27_00002.jpg


Вот и всё.
Удачи в ваших начинаниях
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
BaJIeHoK
 
Сообщения: 80
Зарегистрирован: 03 апр 2014, 23:49
Откуда: Москва
Забанен
Благодарил (а): 12 раз.
Поблагодарили: 55 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Взаимодействие PHP и сервера

Сообщение 9iky6 » 27 май 2014, 08:48

Вот теперь мне интересно: зачем переписывать на новый лад старые темы и подавать их на этом же форуме?
Аватара пользователя
9iky6
 
Сообщения: 2174
Зарегистрирован: 30 янв 2012, 19:07
Откуда: Россия
Благодарил (а): 375 раз.
Поблагодарили: 707 раз.

Re: Взаимодействие PHP и сервера

Сообщение BaJIeHoK » 27 май 2014, 08:49

9iky6 писал(а):Вот теперь мне интересно: зачем переписывать на новый лад старые темы и подавать их на этом же форуме?

О каких старых темах идет речь?
Аватара пользователя
BaJIeHoK
 
Сообщения: 80
Зарегистрирован: 03 апр 2014, 23:49
Откуда: Москва
Забанен
Благодарил (а): 12 раз.
Поблагодарили: 55 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6


Re: Взаимодействие PHP и сервера

Сообщение BaJIeHoK » 27 май 2014, 09:04

Эта копия этой

Тут да, решил немного переделать, описался на неё.

Текущая копия этой

Эту статью не видел. Да и у меня немного расширенно.
Упор был совсем от другого источника с аленей и то только про rcon_hi_net.

В принципи соглашусь, что произошел дублях - тему можно удалить
Аватара пользователя
BaJIeHoK
 
Сообщения: 80
Зарегистрирован: 03 апр 2014, 23:49
Откуда: Москва
Забанен
Благодарил (а): 12 раз.
Поблагодарили: 55 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Взаимодействие PHP и сервера

Сообщение Safety1st » 27 май 2014, 10:31

Передавайте цель как userid. Будет и отличие, и алгритм чуточку лучше.
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Взаимодействие PHP и сервера

Сообщение 9iky6 » 27 май 2014, 10:37

Developer писал(а):алгритм чуточку лучше.

:-|

[pawn]
  1. new id = find_player("a", szParseName); //Ведем поиск по нику
[/pawn]
>>>
[pawn]
  1. new id = cmd_target(0, szParseName, 4);
[/pawn]

+ про экранирование дополнительных ковычек можно рассказать, чтобы при парсинге люди как я не мучались :-) У тебя как раз должна быть ошибка
[pawn]
  1. $command = "php_setplayer ".$nick." ".$num.""
[/pawn]
>>>
[pawn]
  1. $command = "php_setplayer \"".$nick."\" ".$num.""
[/pawn]
Вроде так должно быть на сколько я помню :-) Под рукой сейчас нет, могу попозже посмотреть как у меня выводятся строки и скинуть
Аватара пользователя
9iky6
 
Сообщения: 2174
Зарегистрирован: 30 янв 2012, 19:07
Откуда: Россия
Благодарил (а): 375 раз.
Поблагодарили: 707 раз.

Re: Взаимодействие PHP и сервера

Сообщение BaJIeHoK » 27 май 2014, 11:16

Developer писал(а):Передавайте цель как userid. Будет и отличие, и алгритм чуточку лучше.

Если к примеру вебчасть зависнет или нечто подобное, а игрок в этот момент вышел и на его место зайдет другой, то ему будет выдано. Я бы не сказал, что это чуточку лучше.

Разумеется данный исход событий 1 на миллион, но всё же надо учитывать.

По поводу парсинга - очень ценное замечание кстати.
Аватара пользователя
BaJIeHoK
 
Сообщения: 80
Зарегистрирован: 03 апр 2014, 23:49
Откуда: Москва
Забанен
Благодарил (а): 12 раз.
Поблагодарили: 55 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Взаимодействие PHP и сервера

Сообщение sa1me » 27 май 2014, 11:47

Весьма полезно, спасибо )))
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 177 раз.
Опыт программирования: Меньше недели

Re: Взаимодействие PHP и сервера

Сообщение Safety1st » 27 май 2014, 12:06

BaJIeHoK писал(а):Если к примеру вебчасть зависнет или нечто подобное, а игрок в этот момент вышел и на его место зайдет другой, то ему будет выдано. Я бы не сказал, что это чуточку лучше.

Разумеется данный исход событий 1 на миллион, но всё же надо учитывать.

Не-а) userid - уникальный для каждого игрока во время работы сервера.
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1958
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 933 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Half-Life

След.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2