• Страница 1 из 1
  • 1
Модератор форума: LightInDarkness  
[Скрипт] Следим за сливом арены
shadowcore
Скаут
Данный скрипт будет вести логи Арена Битв время которых <40sec
Скрипт разработал: BeLove (Скажем ему спасибо)
Код
<?php      
###################################################################################################      
# СОДЕРЖАНИЕ      
#      
#    АВТОР, КОНТАКТЫ      
#     ОПИСАНИЕ РАБОТЫ СКРИПТА      
#     ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ      
#    НАСТРОЙКА ПОДКЛЮЧЕНИЯ К БАЗЕ      
#    НАСТРОЙКИ СКРИПТА      
#      
###################################################################################################      

############# ### ###################################################################################      
# АВТОР, КОНТАКТЫ      
#      
#         Автор    : BeLove      
#        
#          
#      
###################################################################################################      

#  ##################################################################################################      
# ОПИСАНИЕ РАБОТЫ СКРИПТА      
#  ЛОГИРУЕТ ВСЕ "ПЕРЕЛИВЫ" АРЕНЫ
#      
###################################################################################################      

################### ## ##############################################################################      
# ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ      
#      
/*      
DROP TABLE IF EXISTS `arena_leavers_temp`;      
CREATE TABLE `arena_leavers_temp` (      
      `game_time_start` varchar(10) DEFAULT 'NULL',      
      `game_time_end` varchar(10) DEFAULT 'NULL',      
      `game_type` tinyint(3),      
      `team1_id` int(10),      
      `team1_damage` int(10) DEFAULT '0',      
      `team1_heal` int(10) DEFAULT '0',      
      `team1_kb` tinyint(3) DEFAULT '0',      
      `team2_id` int(10),      
      `team2_damage` int(10) DEFAULT '0',      
      `team2_heal` int(10) DEFAULT '0',      
     `team2_kb` tinyint(3)  DEFAULT '0');      
           
     DROP TABLE IF EXISTS `arena_leavers_stat`;      
CREATE TABLE `arena_leavers_stat` (      
      `teamid` int(10),      
      `count` int(10) DEFAULT '0');      
*/      
#      
###################################################################################################      

#################### ### ############################################################################      
# НАСТРОЙКА ПОДКЛЮЧЕНИЯ К БАЗЕ      
#      
#    Укажите ниже параметры для подключения: хост, имя пользователя, пароль, имя базы данных      

$mysql_host = "localhost";      
$mysql_user = "root";      
$mysql_pass = "root";      
$mysql_db = "characters";    

#      
###################################################################################################      

#################### ### ############################################################################      
# НАСТРОЙКИ СКРИПТА      
#      
#    Имя файла, содержащего логи арены      

$arena_log_file = "arena.log";      

#    Минимальная разница в секундах между началом и концом игры      

$max_delta = 40;      

#    Анализировать расширенные логи (ставьте 0, если в конфиге       
#    выставлено ArenaLog.ExtendedInfo = 0 и наоборот)      

$extended_logs = 0;      

#    Ничего не трогайте ниже, если режим ArenaLog.ExtendedInfo равен нулю      
#    Минимальные значения хила/дамага для обеих команд за одну игру (общий дамаг и хил игры)      

$min_heal = 1;      
$min_dmg = 1;      

#    Минимальные значения убийств для одной из команд за одну игру      
#    (в зависимости от типа игры (2х2, 3х3, 5х5)      
#    укажите "0", если не хотите учитывать этот параметр      

$min_kb_2 = 2;      
$min_kb_3 = 3;      
$min_kb_5 = 5;      

#      
###################################################################################################      

set_time_limit(0);       
error_reporting(0);      
mysql_connect ($mysql_host, $mysql_user, $mysql_pass) or die (mysql_error());      
mysql_select_db ($mysql_db) or die (mysql_error());      

###################################################################################################      
#      
#    Начало работы первого этапа.      
#    Включает в себя перенос частично обработанных записей об играх в MySQL      
#      
###################################################################################################      

if (!isset($_GET[step]))      
{      

//это так, за ранее обнулим      
$team1_damage = 0; $team2_damage = 0;      
$team1_heal = 0; $team2_heal = 0;      
$team1_kb = 0; $team2_kb = 0;      

echo "<h3>Первый этап.</h3> Перенос нужной информации из логов в MySQL<br />      
        <i>Процесс пошел...</i><br/><br/>";      
mysql_query ("TRUNCATE `arena_leavers_temp`") or die(mysql_error());       
$fp = fopen($arena_log_file, "r");      
if ($fp)       
{      
while (!feof($fp))      
{      
        $arena = explode(" ", fgets($fp, 999));      
        // $arena[12] - "started" or "ended"      
        if (trim($arena[12]) == "started.")      
        {      
            $ymd = explode ("-", $arena[0]);      
            $hms = explode (":", $arena[1]);      
            $time = mktime($hms[0], $hms[1], $hms[2], $ymd[1], $ymd[2], $ymd[0]);      
            mysql_query ("INSERT INTO `arena_leavers_temp` VALUES ('{$time}', '', {$arena[5]}, {$arena[8]}, '','','', {$arena[11]}, '', '', '')")  or die(mysql_error());      
        }      
              
        if ($arena[12] == "ended.")      
        {      
            // проверка, есть ли запись о начале для данной игры. game_time_end нам это и скажет.      
            $query = mysql_query ("SELECT game_time_start FROM `arena_leavers_temp` where team1_id = {$arena[8]} and team2_id = {$arena[11]}      
                       and game_time_end = ''") or die(mysql_error());      
            $sql = mysql_fetch_array($query);      
            if ($sql['game_time_start'] > 0)      
            {      
                //забираем время игры      
                $ymd = explode ("-", $arena[0]);      
                $hms = explode (":", $arena[1]);      
                $time = mktime($hms[0], $hms[1], $hms[2], $ymd[1], $ymd[2], $ymd[0]);      
                //забираем расширенную статистику, если надо      
                if ($extended_logs)      
                {      
                    //сбрасываем сумарные данные по командам (дамаг, хил, количество убийств)      
                    $team1_damage = 0; $team2_damage = 0;      
                    $team1_heal = 0; $team2_heal = 0;      
                    $team1_kb = 0; $team2_kb = 0;      
                    $extended_info = explode(" ", fgets($fp, 999));      
                    while ($extended_info[2] == "Statistics")      
                    {      
                        //Запятая в конце - чтобы не вырезать ее из первой переменной, быстрее и проще <img src="http://s8.ucoz.net/sm/1/smile.gif" border="0" align="absmiddle" alt="smile">      
                        //для первой команды      
                        if ($extended_info[8] == $arena[8].",")      
                            {      
                          
                      $team1_damage = $team1_damage + $extended_info[11];      
                      $team1_heal = $team1_heal + $extended_info[13];      
                      $team1_kb = $team1_kb + $extended_info[15];      
                            }      
                        //для второй      
                        else if ($extended_info[8] == $arena[11].",")      
                            {      
                      $team2_damage = $team2_damage + $extended_info[11];      
                      $team2_heal = $team2_heal + $extended_info[13];      
                      $team2_kb = $team2_kb + $extended_info[15];      
                            }      
                        $extended_info = explode(" ", fgets($fp, 999));      
                    }      
                }      
                //и записываем все в базу      
                mysql_query ("update `arena_leavers_temp` set       
                            game_time_end = '{$time}',      
                            team1_damage = '{$team1_damage}', team1_heal = {$team1_heal}, team1_kb = {$team1_kb},       
                            team2_damage = {$team2_damage}, team2_heal = {$team2_heal}, team2_kb = {$team2_kb}      
                            where      
                            game_time_start = '{$sql['game_time_start']}' and      
                            team1_id = {$arena[8]} and      
                            team2_id =  {$arena[11]};") or die (mysql_error());      
            } else echo "<B>[notice]</b> Была найдена запись об окончании игры, для которой нет информации о ее начале!      
                 Игра {$arena[8]} vs {$arena[11]}. Тип игры - {$arena[5]} x {$arena[5]}<br />";      
        }      
}      
} else echo "Ошибка при открытии файла $arena_log_file. Возможно, файл не существует.";      
fclose($fp);      

echo "<br />Перенос данных успешно завершен!<br />      
        <a href = ?step=2>Перейти ко второму этапу...</a>";      
}      

###################################################################################################      
#      
#    Второй этап      
#    Анализ игр на переливы      
#      
###################################################################################################      

if (isset($_GET[step]) && $_GET[step] == 2)      
{      
        echo "<h3>Второй этап.</h3> Анализ полученных данных.";      
        $sql = mysql_query("SELECT count(1) as count FROM `arena_leavers_temp`;") or die (mysql_error());      
        $result = mysql_fetch_array($sql);      
        echo "<br /><br /><li>Всего игр: <b>$result[count]</b></li>";      
        $sql = mysql_query("SELECT 1 FROM `arena_leavers_temp` where game_time_end = '';") or die (mysql_error());      
        $result = mysql_num_rows($sql);      
        if ($result) echo "<li>Количество игр, для которых мы не смогли найти конечные данные: <b>$result</b></li>      
        <small>*Возможные причины -  неполный лог/краши сервера во время игр</small><br />";      
        $sql = mysql_query("SELECT team1_id FROM `arena_leavers_temp` where game_time_end <> ''      
                            UNION SELECT `team2_id` FROM `arena_leavers_temp` where game_time_end <> '';") or die (mysql_error());      
        $result = mysql_num_rows($sql);      
        echo "<li>Количество команд для обработки: <b>$result</b><br />";      
        //заполняем "нулевую" статистику для каждой команды      
        mysql_query ("TRUNCATE `arena_leavers_stat`") or die(mysql_error());       
        while ($row=mysql_fetch_assoc($sql))      
        {      
            mysql_query ("INSERT INTO `arena_leavers_stat` VALUES ({$row[team1_id]}, '0')") or die (mysql_error());      
        }      
        //Начинаем анализ. Для расширенных логов:      
        if ($extended_logs)      
        {      
            $sql = mysql_query("SELECT * FROM `arena_leavers_temp` where       
                      game_time_end <> '' and       
                      team1_heal + team2_heal < {$min_heal} and      
                      team1_damage + team2_damage < {$min_dmg} and      
                      game_time_end - game_time_start < {$max_delta};") or die (mysql_error());      
            while ($row=mysql_fetch_array($sql))      
            {      
                switch ($row[game_type])      
                {      
                    case "2":      
                    if ($row[team1_kb] < $min_kb_2 && $row[team2_kb] < $min_kb_2)      
                        mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");      
                    break;      
                          
                    case "3":      
                    if ($row[team1_kb] < $min_kb_3 && $row[team2_kb] < $min_kb_3)      
                        mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");      
                    break;      
                          
                    case "5":      
                    if ($row[team1_kb] < $min_kb_5 && $row[team2_kb] < $min_kb_5)      
                        mysql_query ("UPDATE arena_leavers_stat set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");      
                    break;      
                }      
            }      
        }      
        //для обычных логов, смотрим только время      
        else      
        {      
            $sql = mysql_query("SELECT * FROM `arena_leavers_temp` where      
                      game_time_end <> '' and      
                      game_time_end - game_time_start < {$max_delta}") or die (mysql_error());      
            while ($row=mysql_fetch_array($sql))      
                mysql_query ("UPDATE arena_leavers_stat       
                            set count = count + 1 where teamid in ({$row[team1_id]}, {$row[team2_id]})");      
        }      
        // всё!      
        $sql = mysql_query("SELECT SUM(COUNT) as sum FROM `arena_leavers_stat`") or die (mysql_error());      
        $total = mysql_fetch_array($sql);      
        echo "<br />Работа скрипта завершена. <br />      
            Переливов выявлено: {$total[sum]}<br />      
            Можете использовать данные по каждой команде в таблице `arena_leavers_stat` в любых целях";      
}      
?>


Добавлено (07.02.2011, 18:42)
---------------------------------------------
Хотябы отзывы оставляйте.
Очень хорошая вещь!

Добавлено (07.02.2011, 20:19)
---------------------------------------------
Плюсы мне не к чему...Но кто тестирует отписывайтесь хотябы
Крым корочи.
Сообщение # 1 отредактировано Sherlоck - Среда, 05.02.2014, 21:15
frad
Скаут
belove чтото знакомое
он случайно не с gw серва?
Сообщение # 2 написано 08.02.2011 в 17:10
shadowcore
Скаут
Без понятия
Крым корочи.
Сообщение # 3 отредактировано shadowcore - Вторник, 08.02.2011, 19:40
wowGFP
Сержант
shadowcore, Первый этап.
Перенос нужной информации из логов в MySQL
Процесс пошел...

Table 'charfun.arena_leavers_temp' doesn't exist
blink WTF???
Сообщение # 4 написано 29.01.2012 в 17:56
lexasuper
Скаут
Спасибо
Сообщение # 5 написано 06.03.2012 в 22:36
RazArt
Тазовод
wowGFP, учимся читать
Code
##############################################################################      
# ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ      
#      
/*      
DROP TABLE IF EXISTS `arena_leavers_temp`;      
CREATE TABLE `arena_leavers_temp` (      
      `game_time_start` varchar(10) DEFAULT 'NULL',      
      `game_time_end` varchar(10) DEFAULT 'NULL',      
      `game_type` tinyint(3),      
      `team1_id` int(10),      
      `team1_damage` int(10) DEFAULT '0',      
      `team1_heal` int(10) DEFAULT '0',      
      `team1_kb` tinyint(3) DEFAULT '0',      
      `team2_id` int(10),      
      `team2_damage` int(10) DEFAULT '0',      
      `team2_heal` int(10) DEFAULT '0',      
     `team2_kb` tinyint(3)  DEFAULT '0');      
           
     DROP TABLE IF EXISTS `arena_leavers_stat`;      
CREATE TABLE `arena_leavers_stat` (      
      `teamid` int(10),      
      `count` int(10) DEFAULT '0');      
*/      
#      
###################################################################################################  
DumpMe v1.0 - система автоматического переноса персонажей

Вышла в свет первая стабильная версия. Писать в скайп - razart8
Сообщение # 6 написано 07.03.2012 в 17:20
pulvik
Скаут
Этот скрипт взят с trinity core
Belove - администратор Game World (кто знает тот поймет)
Сообщение # 7 отредактировано pulvik - Среда, 07.03.2012, 18:27
zversik
Сержант
хороший скрипт спасибо
Сообщение # 8 написано 08.03.2012 в 23:36
Incognito506
Скаут
Отличный скрипт,спасибо.
Сообщение # 9 написано 08.03.2012 в 23:38
PadreWoW
Капрал
Вопрос возник - есть ли способ осуществлять проверку по IP членов команд?
Ведь игрок может сливать сам себе
Сообщение # 10 отредактировано PadreWoW - Пятница, 23.03.2012, 15:46
ghamlet
Скаут
Что это за ошибка и как избавиться ?
[notice] Была найдена запись об окончании игры, для которой нет информации о ее начале! Игра 592 vs 477. Тип игры - 2 x 2
[notice] Была найдена запись об окончании игры, для которой нет информации о ее начале! Игра 592 vs 477. Тип игры - 2 x 2
Сообщение # 11 написано 21.03.2012 в 03:31
Rewar
Центурион
Автор скрипта Belove, все вопросы задавайте ему:)
Сообщение # 12 написано 22.03.2012 в 09:26
(mr-BO)
Капрал
хорошая вещь
Мой Сайт Здесь!!! ((Требуется журналист на сайт стучатся в пм))
Сообщение # 13 написано 22.03.2012 в 11:09
PadreWoW
Капрал
Вообще никакая вещь
она требует анализа файла arena.log из самого сервера
а если у вас сервер не позволяет логировать выходы-выходы команд и данные по ним то этот скрипт ВООБЩЕ НИЧЕГО вам не покажет
кроме того получается что этот анализ возможно проводить только в ручном режиме и ему нужно каждый раз ПОДКЛАДЫВАТЬ лог-файл чтобы он его анализировал!
Сообщение # 14 отредактировано PadreWoW - Пятница, 23.03.2012, 13:55
  • Страница 1 из 1
  • 1
Поиск: