Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Языки программирования (http://mangos.ytdb.ru/forumdisplay.php?f=34)
-   -   Скрипты для сайта. (http://mangos.ytdb.ru/showthread.php?t=89)

Yoda 07.03.2010 15:48

Скрипты для сайта.
 
Config.php
PHP код:

<?
$ip        
="127.0.0.1";        // server IP
$dbip        ="127.0.0.1";        // mysql IP
$dbport        ="3306";        // mysql порт
$gameport    ="8085";        // Порт сервера(game)
$dblogin    ="login";        // mysql юзер
$dbpass        ="pass";        // mysql пароль
$mdb        ="mangos";        // База мира
$rdb        ="realmd";        // База аккаунтов
$cdb        ="characters";        // База персонажей
?>

Подключение к Базе данных:
PHP код:

<?
require_once ('config.php');
mysql_connect ("$dbip:$dbport","$dblogin","$dbpass");
?>

Количество созданных аккаунтов, количество по фракциям, количество гильдий:
PHP код:

<?
mysql_selectdb 
("$rdb");
$acc mysql_query ("select count(`id`) from `account`");
$acc mysql_result ($acc,0);
mysql_selectdb ("$cdb");
$char mysql_query ("select count(`guid`) from `characters`");
$char mysql_result ($char,0);
$alliance mysql_query ("select count(`guid`) from `characters` where `race` in (1,3,4,7,11)");
$alliance mysql_result ($alliance,0);
$horde mysql_query ("select count(`guid`) from `characters` where `race` in (2,5,6,8,10)");
$horde mysql_result ($horde,0);
$guild mysql_query ("select count(`guildid`) from `guild`");
$guild mysql_result ($guild,0);
echo 
"Account: $acc<br>";
echo 
"Characters: $char<br>";
echo 
"Alliance: $alliance<br>";
echo 
"Horde: $horde<br>";
echo 
"Guild: $guild<br>";
?>

Статус сервера:
PHP код:

<?
$fp 
= @fsockopen ("$ip","$gameport",$errno,$errstr,1);
if (
$fp)
echo 
"Server: online><br>";
else
echo 
"Server: offline><br>";
?>

Игроки он-лайн:
PHP код:

<?
mysql_selectdb 
("$cdb");
$online mysql_query ("select count(`guid`) from `characters` where `online` = 1");
$online mysql_result ($online,0);
echo 
"Players Online: $online<br>";
?>

Аптайм:
PHP код:

<?
mysql_select_db 
("$mdb");
$uptime mysql_query ("select max(`starttime`) from `uptime`");
$uptime time()-mysql_result ($uptime,0);
$sec $uptime%60;
$uptime intval ($uptime/60);
$min $uptime%60;
$uptime intval ($uptime/60);
$hours $uptime;
echo 
"Uptime: $hours h $min min $sec sec<br>";
?>

Статистика по расам и классам:


Тема с mangos.ru, автора не помню...

Madmunus 07.03.2010 17:05

последний скрипт убийственный)

DeusModus 07.03.2010 17:32

Цитата:

Сообщение от Madmunus (Сообщение 360)
последний скрипт убийственный)

20 запросов к БД.. Ассоциативные массивы автору сего чуда были неведомы.

Madmunus 07.03.2010 18:02

Цитата:

Сообщение от DeusModus (Сообщение 364)
20 запросов к БД.. Ассоциативные массивы автору сего чуда были неведомы.

Да я тож так подумал =)))

Madmunus 08.03.2010 20:16

Вот очень хороший скриптик на js, очень полезен для создания админки, для любого сайта.

Скрытый текст (вы должны войти под своим логином или зарегистрироваться и иметь 5 сообщение(ий)):
У вас нет прав чтобы видеть скрытый текст, содержащейся здесь.

Madmunus 08.03.2010 20:34

Понимаю что не намного лучше но все таки:

Desperado 09.03.2010 00:27

Вложений: 1
Гейм мастера онлайн

Код:

<html>
<body>
                    <table border = "1" align = "center">
                            <tr>
                            <td>Ник</td>
                            <td>Расса</td>
                            <td>Класс</td>
                            <td>Уровень доступа</td>
                            </tr>                   
<?php

                        /**
                          * @author [Desperado]
                          * @copyright 2010
                          */

                            require_once ('includes/config.php'); //подключаем файл конфигурации

                    $Sql = mysql_connect("$host", "$db_user", "$db_user_passw") or die("Невозможно подключиться к базе данных : " . mysql_error()); //соединяемся с базой MySQl
                    mysql_query("SET character_set_database = '$charset'");  //устанавливаем кодировку
                    mysql_query("SET NAMES '$charset'");  //устанавливаем кодировку
                         
                      $content = mysql_query ("select c.name, c.class, c.race, a.gmlevel from characters.characters c inner join realmd.account
                      a on a.id=c.account where a.gmlevel != 0 and c.online = 1");      //достаём нужные данные
                      $online = mysql_num_rows($content);
                           
                            /**
                        * мутим обработку данных из массива
                        */             
                   
                            $class = array(1=>"Воин",2=>"Паладин",3=>"Охотник",4=>"Разбойник",5=>"Жрец",
                        6=>"Рыцарь Смерти",7=>"Шаман",8=>"Маг",9=>"Чернокнижник",11=>"Друид");                         
                            $race = array(1=>"Человек",2=>"Орк",3=>"Дворф",4=>"Ночной Эльф",5=>"Нежить",6=>"Таурен",7=>"Гном",8=>"Тролль",
                        10=>"Эльф Крови",11=>"Дреней");
                            $gmlevel = array(1=>'Модератор',2=>'Хелпер',3=>'Гейм Мастер',4=>'Администратор');
                         
                            /**
                        * если гм нет, выводим неприличное сообщение
                        */                         
                     
                            if($online < 1) {
                            echo "<tr><td colspan='4' align='center'>Нет гм, вошедших в игру</td></tr>";
                            }                         
                       
                          /**
                        * если гм есть, выводим другое неприличное сообщение
                        */                         
                       
                       
                          while ($row = mysql_fetch_array($content))                         
                            {
                    $name = $row['name'];
                        echo "<tr><td><b>{$name}</b></td>";  //выводим ник Гм
                        echo "<td><b>{$race[$row['race']]}</b></td>";  //Выводим рассу
                        echo "<td><b>{$class[$row['class']]}</b></td>"; //Выводим класс
                        echo "<td><b>{$gmlevel[$row['gmlevel']]}</b></td></tr>"; //Выводим уровень доступа
                    }     

mysql_close($Sql);                 

?>
</table>
</body>                           
</html>

кол-во аккаунтов, максимальный аптайм, текущий онлайн, кол-во чаров за орду/альянс

Код:

           
      require_once ('includes/config.php'); //подключаем файл конфигурации
      $sMySql = mysql_connect('$host', ' $db_user', '  $db_user_passw') or die("Невозможно подключиться к базе : " . mysql_error());; //открываем mysql.
           
           
      $aSql = mysql_num_rows(mysql_query("SELECT guildid FROM characters.guild", $sMySql));
      $nTotalGuild = $aSql;

          $aSql = mysql_num_rows(mysql_query("SELECT guid FROM characters.characters WHERE race IN ( 1, 4, 11, 3, 7 )", $sMySql));
      $nTotalAlliance = $aSql;
      $aSql = mysql_num_rows(mysql_query("SELECT guid FROM characters.characters WHERE race IN (6, 10, 5, 2, 8)", $sMySql));
      $nTotalHorde = $aSql;

      function conventNormTime($nSec) {
        $d = floor( $nSec / (3600*24) );
              $nSec = ($nSec - $d * 3600 * 24);
              $h = floor( $nSec / 3600 );
              $nSec = ($nSec - $h * 3600);
              $m = floor( $nSec / 60 );
            return "{$d} д. {$h} ч. {$m} м.";
      }
             
      $aSql = mysql_fetch_array(mysql_query("SELECT maxplayers FROM realmd.uptime ORDER by maxplayers DESC LIMIT 1", $sMySql));
      $nMaxOnline = $aSql['maxplayers'];
           
      $aSql = mysql_fetch_array(mysql_query("SELECT uptime FROM realmd.uptime ORDER by starttime DESC LIMIT 1", $sMySql));
        $tUptime = conventNormTime($aSql['uptime']);

                    $aSql = mysql_query("SELECT uptime FROM realmd.uptime ORDER by uptime DESC LIMIT 1", $sMySql);
                    $aSql =mysql_fetch_array($aSql);
                    $aTotal = $aSql['uptime'];
                    $aTotal = conventNormTime($aSql['uptime']);

      $aSql = mysql_num_rows(mysql_query("SELECT id FROM realmd.account", $sMySql));
      $nTotalAccount = $aSql;

$aSql = mysql_num_rows(mysql_query("SELECT guid FROM characters.characters WHERE online IN ( 1 )", $sMySql));
$nCurrenOnline = $aSql;
           
           
        $aOut = array(
          'online' => $nCurrenOnline,
          'max_online' => $nMaxOnline,
          'uptime' => $tUptime,
          'max_uptime' => $aTotal,
          'reg_accounts' => $nTotalAccount,
      'reg_horde' => $nTotalHorde,
      'reg_alliance' => $nTotalAlliance,
        );

      echo    '<tr><td>Онлайн:</td> <td><b>{$nCurrenOnline}</b></td></tr>';
      echo    '<tr><td>Макс. онлайн:</td> <td><b>{$nMaxOnline}</b></td></tr>';
      echo    '<tr><td>Макс. аптайм:</td> <td><b>{$aTotal}</b></td></tr>';

           
      echo    '<tr><td>Акаунтов:</td> <td><b>{$nTotalAccount}</b></td></tr>';
      echo    '<tr><td>Альянса:</td> <td><b>{$nTotalAlliance}</b></td> </tr>';
      echo    '<tr><td>Орды:</td> <td><b>{$nTotalHorde}</b></td></tr>';

 mysql_close ($sMySql)
?>

Отображение открытых/закрытых инстов ВОТЛК.
если инст имеет уровень выше 71, но не выше 80 - открыт
если инст имеет уровень выше 80 - закрыт
Инфу записывает в текстовый файл. Кому надо, переделают за 10 секунд


Код:

<?php
  require_once ('includes/config.php');
              $sMySql = mysql_connect($host, $user, $passw) or die("Невозможно подключиться к базе : " . mysql_error());
      mysql_select_db('mangos', $sMySql) or die("Невозможно подключиться к базе characters : " . mysql_error());
              $content = mysql_query("SELECT `required_level` , `name` FROM areatrigger_teleport WHERE `required_level` >= '71' ORDER BY `areatrigger_teleport`.`required_level` DESC"); //выборка данных
          //обработка в массиве
      $name = array (
  'Onyxia\'s Lair - Dustwallow Instance' => 'Логово Ониксии',
  'Naxxramas (Inside)' => 'Наксрамас',
  'Violet Hold (entrance)' => 'Аметистовая крепость',
  'Oculus (exit)' => 'Нексус: Окулус',
  'The Nexus (exit)' => 'Нексус: Нексус', 
  'Utgarde Pinnacle (exit)' => 'Крепость Утгард: Вершина Утгард',
  'Utgarde Keep (entrance)' => 'Крепость Утгард: Крепость Утгард', 
  'Ulduar, Halls of Lightning (entrance)' => 'Ульдуар: Чертоги Молний',
  'Ulduar, Halls of Stone (exit)' => 'Ульдуар: Чертоги Камня',
  'Drak\'Tharon Keep (exit)' => 'Крепость Драк\'Тарон',
  'Vault of Archavon (Exit)' => 'Склеп Аркавона',
  'Azjol-Nerub (entrance)' => 'Азжол-Неруб: Азжол-Неруб',
  'Ahn\'Kahet (entrance)' => 'Азжол-Неруб: Ан\'кахет: Старое Королевство',
  'Chamber of Aspects, Obsidian Sanctum (entrance)' => 'Обсидиановое святилище',
  'The Eye of Eternity' => 'Нексус: Око Вечности',
  'Gundrak (exit south)' => 'Гундрак',
  'Ulduar Raid entrance' => 'Ульдуар',
  'Trial of the Crusader (exit)' => 'Испытание крестоносца',
  'Trial of the Champion (entrance)' => 'Испытание чемпиона',
  'Halls of Reflection (Entrance)' => 'Цитадель Ледяной Короны: Залы Отражений',
  'Forge of Souls (Entrance)' => 'Цитадель Ледяной Короны: Кузня Душ',
  'IceCrown Citadel (Entrance)' => 'Цитадель Ледяной Короны', 
  'Culling of Stratholme (entrance)' => 'Пещеры Времени: Очищение Стратхольма',
  'Pit of Saron (Entrance)' => 'Цитадель Ледяной Короны: Яма Сарона');
   
      // строим таблицу
        $szTable = '<table border="1" align="center">';
      $szTable .= '<tr> <td align="center"><b>Название</b></td><td><b>Статус</b></td></tr>';     
       
                            while ($row = mysql_fetch_array($content))                           
                    { 
          if ( isset($name[$row['name']]) ) {
          $required_level = $row['required_level'];
                    if ($required_level <= 80)
                    {
      $szTable .= '<tr> <td align="left">'.$name[$row['name']].'</td> <td align="center"><font color="green">Открыт</font></td>';       
              } else
                    {
      $szTable .= '<tr> <td align="left">'.$name[$row['name']].'</td> <td align="center"><font color="red">Закрыт</font></td>';                   
                    }                   
                    } 
                    } 
        $szTable  .= '</table>';   
      $szTable .= '<br>';
      $szTable .= '<br>';
     
          $handler = fopen("inst.txt", "w+");
          fwrite($handler, $szTable);
          fclose($handler);
          mysql_close($sMySql);     
?>

Отправка почты
Для работы необходим патч extern mail
Патч прилагается в атаче


Код:

CREATE TABLE IF NOT EXISTS `mail_external` (
  `id` int(20) unsigned NOT NULL auto_increment,
  `receiver` bigint(20) unsigned NOT NULL,
  `subject` varchar(200) default 'Support Message',
  `message` varchar(500) default 'Support Message',
  `money` int(20) unsigned NOT NULL default '0',
  `item` int(20) unsigned NOT NULL default '0',
  `item_count` int(20) unsigned NOT NULL default '1',
  PRIMARY KEY  (`id`)
) ENGINE

Код:

<?php

/**
 * @author Desperado
 * @copyright 2010
 * Скрипт рассылки вещей на почту игроков
 * Для работы необходим патч extern mail
 */
 
  require_once ('includes/config.php'); //подключаем конфиг
  $sMySql = mysql_connect($host, $user, $passw)
      or die("Невозможно подключиться к базе данных : " . mysql_error());  //соеденяемся с базой данных
    mysql_select_db('characters', $sMySql)
      or die("Невозможно выбрать базу"); //подключаем базу данных персонажей 
 
      /**
      * временные данные
      */
         
$receiver = 18143; //Guid получателя
$subject = subject; //Заголовок сообщения
$message = message; //Тело сообщения
$money = 0; //Скок голда
$item = 2342; //ID вещи
$item_count = 1; //Количество вещей

      /**
      * Посылаем вещь
      */

  $last_mail_id = mysql_fetch_array(mysql_query("SELECT id FROM `characters`.`mail_external` ORDER by id DESC LIMIT 1")); //выбираем последние айди
  $last_mail = $last_mail_id['id'] +1;
  $result = mysql_query("INSERT INTO `characters`.`mail_external` (
                                                                    `id` ,
                                                                    `receiver` ,
                                                                    `subject` ,
                                                                    `message` ,
                                                                    `money` ,
                                                                    `item` ,
                                                                    `item_count`
                                                                    )
                        VALUES ('$last_mail', '$receiver', '$subject', '$message', '$money', '$item','$item_count')");

mysql_close ($sMySql);                                                                         
?>

Парсинг и вывод статистики MMOTOP
Добавляем в константу ссылку из лк ммотопа и радуемся.

Код:

<?php

define('HASH_URL', 'ссылка');
                     
            $aData = @file_get_contents(HASH_URL); // подгружаем в массив информацию
            preg_match_all("|.*\t.*\t.*\t(.*)\t.*\n|isU",$aData,$aArgs); // мутим обработку на данные
            $aArray = array();
            for ($i = 0; $i < count($aArgs[1]); $i ++ ) {
            if ( ! $aArray[$aArgs[1][$i]] )
              $aArray[ $aArgs[1][$i] ] = 1;
            else
              $aArray[ $aArgs[1][$i] ] = $aArray[ $aArgs[1][$i] ] + 1;
            }
            arsort($aArray);
            $szContent = '<center><table border="1" width="200">';
            $szContent .= '<tr><td align="left"><b>Ник</b></td><td align="left"><b>Голоса</b></td></tr>'."\n";
            foreach ($aArray as $var=>$val) {
            $szContent .= '<tr><td><b>'.$var.'</b></td><td>'.$val.'</td></tr>'."\n";
            }
            $szContent .= '</table></center>';
            $szContent = iconv('cp1251', 'utf-8', $szContent);
            echo $szContent;
?>

Функция конверта времени из линукса

Код:

function conventNormTime($nSec) {
    $d = floor( $nSec / (3600*24) );
          $nSec = ($nSec - $d * 3600 * 24);
          $h = floor( $nSec / 3600 );
          $nSec = ($nSec - $h * 3600);
          $m = floor( $nSec / 60 );
          return "{$d} д. {$h} ч. {$m} м.";
    }


DeusModus 09.03.2010 00:48

Цитата:

Сообщение от Desperado (Сообщение 754)
A lot of text

1. Если в условии отсутствует else можно писать:
PHP код:

if($var==$test) echo("Wooow!"); 

2. Забываете про mysql_close или сбиваетесь. Запомните, синтаксис:
PHP код:

bool mysql_close  (***91; resource $link_identifier  ***93; ) 

3. При операциях над файлами забываете проверки на доступность и прочее.
4. Постоянно забываете проверки or die("Blah Blah").

DeusModus 09.03.2010 00:57

Цитата:

Сообщение от Desperado (Сообщение 754)
Функция конверта времени из линукса

Код:

function conventNormTime($nSec) {
    $d = floor( $nSec / (3600*24) );
          $nSec = ($nSec - $d * 3600 * 24);
          $h = floor( $nSec / 3600 );
          $nSec = ($nSec - $h * 3600);
          $m = floor( $nSec / 60 );
          return "{$d} д. {$h} ч. {$m} м.";
    }


А так
PHP код:

function unix_timestamp_to_human ($timestamp ""$format 'D d M Y - H:i:s')
{
    if (empty(
$timestamp) || ! is_numeric($timestamp)) $timestamp time();
    return (
$timestamp) ? date($format$timestamp) : date($format$timestamp);


не проще ли будет?

Desperado 09.03.2010 01:06

1. добавил вывод ошибок подключения мускуля
2. Закрыл во всех скриптах соединение.
3. проверка файлов... мне как бы не нужна была :)
4. функция вроде и проще, но для понимания всё таки моя нагляднее.

DeusModus 09.03.2010 01:27

Цитата:

Сообщение от Desperado (Сообщение 769)
функция вроде и проще, но для понимания всё таки моя нагляднее.

Хорошо. Вот модификация:
PHP код:

function unix_timestamp_to_human ($timestamp ""$format)
{
    if (empty(
$timestamp) || ! is_numeric($timestamp)) $timestamp time();
    return (
$timestamp) ? date($format$timestamp) : date($format$timestamp);


Пример: echo unix_timestamp_to_human("1234567890",'D d M Y - H:i:s');
На экране: Sat 14 Feb 2009 - 02:31:30
Причем, если это не unixtime, то мы получим текущее время time(), либо по вашему желанию ошибку. Мы можем получить время в любом произвольном формате.

PHP код:

function conventNormTime($nSec) { 
     
$d floor$nSec / (3600*24) ); 
           
$nSec = ($nSec $d 3600 24); 
           
$h floor$nSec 3600 ); 
           
$nSec = ($nSec $h 3600); 
           
$m floor$nSec 60 ); 
          return 
"{$d} д. {$h} ч. {$m} м."
    } 

Пример: echo conventNormTime("1234567890");
На экране: 14288 д. 23 ч. 31 м. (что я делаю не так?)
При неправильном значении выдает 0 д. 0 ч. 0 м.

Да и вообще, почему использовать что-то маленькое и неповоротливое, если есть большое и удобное?

Desperado 09.03.2010 01:31


DeusModus 09.03.2010 02:13

Цитата:

Сообщение от Desperado (Сообщение 778)
Копетан Очевидность подсказывает, что запрос таки неверный :)

Unixtime 1256631201.
Tue 27 Oct 2009 - 11:13:21 :unix_timestamp_to_human
14544 д. 8 ч. 13 м : conventNormTime

Unixtime 1269591201
Fri 26 Mar 2010 - 11:13:21 :unix_timestamp_to_human
14694 д. 8 ч. 13 м. : conventNormTime

Не время для Капитана Очевидности. Ответьте всё-таки, что же здесь не так?

Desperado 09.03.2010 02:25

Снова чувствуется шёпот из-за угла:

Наверное в том, что текущая дата - не цель существования данного кода.
Его цель - перевод таблицы realmd.uptime в человеческий вид.
Если присмотреться, то в 1 из вышеуказанных скриптов присутсвует данное "явление", не нуждающееся в дополнительных осложнениях.

Можно, конечно, собирать велосипед по чертежам танков, но это уже обсуждения в отдельной теме.

update


DeusModus 09.03.2010 02:46

Тьфу вас.
Капитаны и чертержи.
В общем, кто ж знал, что uptime хранит разницу (я уж точно не знал, да и зачем :) ).

Код:

function unix_timestamp_to_human ($timestamp = "", $format)
{
    if (empty($timestamp) || ! is_numeric($timestamp)) $timestamp = time();
    return ($timestamp) ? date($format, $timestamp) : date($format, $timestamp);
}
function conventNormTime($nSec) {
    $d = floor( $nSec / (3600*24) );
          $nSec = ($nSec - $d * 3600 * 24);
          $h = floor( $nSec / 3600 );
          $nSec = ($nSec - $h * 3600);
          $m = floor( $nSec / 60 );
          return "{$d} д. {$h} ч. {$m} м.";
    }
$unix_time = "1239441660";
$delta= "4801";
$result=$unix_time+$delta;

echo unix_timestamp_to_human($unix_time,'D d M Y - H:i:s')."-".unix_timestamp_to_human($result,'D d M Y - H:i:s')."<br>"; //Return: Tue 25 Aug 2009 - 14:47:51
echo conventNormTime($delta);

Спать пора, а то совсем туго с головой становится.
И, да, мы друг друга не поняли.

Madmunus 09.03.2010 06:53

Вот что я использую в своем отдельном проекте:

KiriX 09.03.2010 08:38

DeusModus - я долго въезжал, чего же ты хочешь =)))
Вот компактный красивый код от Chestr'a:
PHP код:

function getTimeText($seconds)
{
  
$text "";
  if (
$seconds >=24*3600) {$text.= intval($seconds/(24*3600))." days"; if ($seconds%=24*3600$text.=" ";}
  if (
$seconds >=   3600) {$text.= intval($seconds/3600)." hours"; if ($seconds%=3600$text.=" ";}
  if (
$seconds >=     60) {$text.= intval($seconds/60)." min"; if ($seconds%=60$text.=" ";}
  if (
$seconds >       0) {$text.= $seconds." sec";}
  return 
$text;



DeusModus 09.03.2010 11:45

Цитата:

Сообщение от KiriX (Сообщение 803)
DeusModus - я долго въезжал, чего же ты хочешь =)))
Вот компактный красивый код от Chestr'a:
PHP код:

function getTimeText($seconds)
{
  
$text "";
  if (
$seconds >=24*3600) {$text.= intval($seconds/(24*3600))." days"; if ($seconds%=24*3600$text.=" ";}
  if (
$seconds >=   3600) {$text.= intval($seconds/3600)." hours"; if ($seconds%=3600$text.=" ";}
  if (
$seconds >=     60) {$text.= intval($seconds/60)." min"; if ($seconds%=60$text.=" ";}
  if (
$seconds >       0) {$text.= $seconds." sec";}
  return 
$text;



Тут говорили о unixtime. Я предложил функцию перевода unixtime в нормальное время. Но по невнимательности(да и времени) я не обратил внимания, что в поле uptime хранится дельта.
Благодарности темпуре за пару значений из этой таблицы.

LordJZ 09.03.2010 15:13

Раз уж начали про вывод времени, позвольте продолжить.

Неймспейс для php, используемый для форматирования времени и строк.
PHP код:

<?php

class Format
{
    private function 
__construct(){}

    public function 
Plural($string$value)
    {
        
$arr explode(':'$string);

        
$value abs($value);
        switch(
count($arr))
        {
            case 
1:
                return 
$string;
            case 
2:
            {
                if(
$value && $value 5)
                    return 
$arr***91;0***93;;
                else
                    return 
$arr***91;1***93;;
            }
            case 
3:
            default:
            {
                if(
$value == 1)
                    return 
$arr***91;0***93;;
                elseif(
$value && $value 5)
                    return 
$arr***91;1***93;;
                else
                    return 
$arr***91;2***93;;
            }
        }
    }

    public function 
Simple($b)
    {
        
$args func_get_args();
        for (
$i 1$count count($args); $i $count$i++)
            
$b str_replace('$'.$i$args***91;$i***93;, $b);
        return 
$b;
    }

    
/***************** TIME *****************/

    
private static $TIME_SG = array('год','месяц','неделя','день','час','минута','секунда');
    private static 
$TIME_PL = array(':года:лет',':месяца:месяцев',':недели:недель',':дня:дней',':часа:часов',':минуты:минут',':секунды:секунд');
    private static 
$TIME_AB = array('г','мес','нед','дн','ч','мин','сек');

    private function 
TimeInternal($value$type$small)
    {
        if(
$small)
            return 
$value.' '.self::$TIME_AB***91;$type***93;;
        else
            return 
$value.' '.($value == self::$TIME_SG***91;$type***93; : self::Plural(self::$TIME_PL***91;$type***93;, $value));
    }

    public function 
DTimeSimple($e)
    {
        
//                year      month    week    day    hour  min sec
        
$barriers = array(315576002629800604800864003600601);
        
$a        = array(1,        3,       3,      -1,    5,    -1,-1);
        
$time max($time1);
        
$count count($barriers);
        for(
$current_barrier 3$current_barrier $count; ++$current_barrier)
        {
            if(
$time >= $barriers***91;$current_barrier***93;)
            {
                
$d $current_barrier;
                
$k floor($e $barriers***91;$d***93;);
                if(
$a***91;$d***93; != -1)
                {
                    
$type $a***91;$d***93;;
                    
$time %= $barriers***91;$d***93;;
                    
$j floor($time $barriers***91;$type***93;);
                    if(
$j 0)
                        return 
self::TimeInternal($k$dtrue).' '.self::TimeInternal($j$typetrue);
                }
                return 
self::TimeInternal($k$dfalse);
            }
        }
        return 
'(n/a)';
    }

    public function 
DTimeStrict($time$useSmall true)
    {
        
$time round($time1);
        
$x '';
        
$barriers = array(315576002629800604800864003600601);
        for(
$i 0$i count($barriers); $i++)
        {
            
$barr $barriers***91;$i***93;;

            if(
$time >= $barr)
            {
                
$time2 floor($time $barr);

                if(
$time2 1)
                    continue;

                
$time %= $barr;
                
$x .= self::TimeInternal($time2$i$useSmall).' ';
            }
        }

        return 
trim($x);
    }
}

?>

Описание функций:

Simple Strict Format
Код:

Format::Simple(string $str, ...)
Оно же индексированный sprintf. Заменяет значениями аргументов конструкции $ + индекс аргумента. Т.е. Format::Simple('Two: $2 One: $1', 'one', 'two') => 'Two: two One: one'

Plural Format
Код:

Format::Plural(string $str, unsigned int $value)
Используется при локализации. Превращает коярвый русзкий в настоящий Русский Язык.
  • Format::Plural('год:года:лет', '1') => 'год'
  • Format::Plural('год:года:лет', '3') => 'года'
  • Format::Plural('год:года:лет', '5') => 'лет'

Format Time Delta Simple
Код:

Format::DTimeSimple(unsigned int $time_delta)
Простое, читаемое, но не абсолютно точное отображение времени, обычно используется для дельты. Format::DTimeSimple(123) => '2 минуты' (хотя это на самом деле 2 минуты 3 секунды). Будет сокращать слова (минуты -> мин) если (максимум) 2 слова.

Format Time Delta Strict
Код:

Format::DTimeStrict(unsigned int $time_delta, bool $small = true)
Тоже самое что и DTimeSimple, но выводит время точно и поддерживает 2 аргумент для использования сокращенных слов (вкл по-умолчанию).
Код:

Format::DTimeStrict(123, false) => '2 минуты 3 секунды'
Format::DTimeStrict(123) => '2 мин 3 сек'


Pro[100]Hens 11.03.2010 10:48

Скрипт на лист банов.
(по IP и Аккаунтам)

config.php:
PHP код:

$host="localhost"// хост базы REALM
$user="mangos" // пользователь базы REALM
$password="mangos"// пароль базы REALM
$dbr="realmd"// название базы REALM 

bans.php
PHP код:

    <?php
// Скрипт показа забанненных аккаунтов и IP адресов by WoW-Ultimate
require_once "config.php";

//подключение к базе
$ConnectDB mysql_connect("$host""$user""$password") or die ("Нет соединения с MySQL");
mysql_select_db("$dbr") or die ("Нет соединения с базой $dbr");
echo 
"<h2>Забаненные аккаунты</h2>";
echo 
"<table width=\"100%\" border=\"1\" align=\"center\"><tr>
<td align=\"center\" width=\"20%\">забанен:</td>
<td align=\"center\" width=\"20%\">Бан установлен:</td>
<td align=\"center\" width=\"20%\">Забанил:</td>
<td align=\"center\" width=\"20%\">Причина:</td>
<td align=\"center\" width=\"20%\">Бан до:</td>
</tr></table>"
;
$i=0;
$data mysql_query("SELECT * FROM account_banned WHERE active = 1 ORDER BY bandate DESC LIMIT 100",$ConnectDB);
$row mysql_fetch_array($data***91;$i***93;); {
while(
$row mysql_fetch_array($data)) {
$banid $row***91;'id'***93;;
$usern mysql_query("SELECT * FROM account WHERE id= $banid LIMIT 1",$ConnectDB);
$rowuser mysql_fetch_array($usern);
$banuser $rowuser***91;'username'***93;;
$bandate date("H:i:s d.m.Y"$row***91;'bandate'***93;);
$bannedby $row***91;'bannedby'***93;;
$banreason $row***91;'banreason'***93;;
$unbandate date("H:i:s d.m.Y"$row***91;'unbandate'***93;);
echo 
"<font color=\"beer\">
<table width=\"100%\" border=\"1\" align=\"center\"><tr>
<td align=\"center\" width=\"20%\">
$banuser</td>
<td align=\"center\" width=\"20%\">
$bandate г.</td>
<td align=\"center\" width=\"20%\">
$bannedby</td>
<td align=\"center\" width=\"20%\">
$banreason</td>
<td align=\"center\" width=\"20%\">
$unbandate г.</td>
</tr></table></font>"
;
$i++;
}
}
//теперь выборка по IP адресам
echo "<h2>БАНЫ по IP </h2><br>";
echo 
"<table width=\"100%\" border=\"1\" align=\"center\"><tr>
<td align=\"center\" width=\"20%\">IP:</td>
<td align=\"center\" width=\"20%\">Бан установлен:</td>
<td align=\"center\" width=\"20%\">Забанил:</td>
<td align=\"center\" width=\"20%\">Причина:</td>
<td align=\"center\" width=\"20%\">Бан до:</td>
</tr></table>"
;
$u=0;
$bannedip mysql_query("SELECT * FROM ip_banned ORDER BY bandate DESC LIMIT 100");
$row mysql_fetch_array($bannedip***91;$u***93;); {
while(
$row mysql_fetch_array($bannedip)) {

$banip $row***91;'ip'***93;;
$bandate date("H:i:s d.m.Y"$row***91;'bandate'***93;);
$bannedby $row***91;'bannedby'***93;;
$banreason $row***91;'banreason'***93;;
$unbandate date("H:i:s d.m.Y"$row***91;'unbandate'***93;);
echo 
"<font color=\"beer\">
<table width=\"100%\"border=\"1\" align=\"center\"><tr>
<td align=\"center\" width=\"20%\">
$banip</td>
<td align=\"center\" width=\"20%\">
$bandate г.</td>
<td align=\"center\" width=\"20%\">
$bannedby</td>
<td align=\"center\" width=\"20%\">
$banreason</td>
<td align=\"center\" width=\"20%\">
$unbandate г.</td>
</tr></table></font>"
;
$u++;
}
}
?>


mozilla 11.03.2010 11:46

Дата начисления АП:

PHP код:

$result mysql_query("SELECT * FROM saved_variables WHERE NextArenaPointDistributionTime");
$myrow mysql_fetch_array($result);
$ap $myrow***91;"NextArenaPointDistributionTime"***93;;
echo 
"Распределение АП:<br>";
echo 
date ('d.m.Y H:i:s'$ap); 

То же самое, только таймером обратного отсчета:

PHP код:

$result mysql_query("SELECT * FROM saved_variables WHERE NextArenaPointDistributionTime");
$myrow mysql_fetch_array($result);
$ap $myrow***91;"NextArenaPointDistributionTime"***93;;
$timeleft $ap-time();
function 
getFormatedTime($timeleft)
{
    
$d intval($timeleft 86400);
    if (
$d <= 0)    $d 0;
    
$timeleft $timeleft $d 86400;
    
$h intval($timeleft 3600);
    if (
$h <= 0)    $h 0;
    
$timeleft $timeleft $h 3600;
    
$m intval($timeleft 60);
    if (
$m <= 0)    $m 0;
    
$s $timeleft $m 60;
    if (
$s <= 0)    $s 0;
    if (
$d 0)            return "$d дн. $h ч. $m мин.";
    else if (
$h 0)    return "$h ч. $m мин. $s сек.";
    else if (
$m 0)    return "$m мин. $s сек.";
    else                return 
"$s сек.";
}
echo 
"Распределение АП через:<br>";
echo 
getFormatedTime($timeleft); 


tempura 11.03.2010 12:45

Цитата:

Сообщение от Pro[100]Hens (Сообщение 1297)
<font color=\"beer\">

бред сумасшедшего....

kBaTT 11.03.2010 15:30

Решил сделать статистику чести, но не знаю где в data хранятся очки чести (убийства тоже).
Зашел на Wiki мангоса, подходящего не нашел, а может плохо посмотрел.
Если можете подкиньте значения поля Data в таблице Characters.

Feel the Power 11.03.2010 15:47

Код:

SELECT `totalHonorPoints` FROM `characters`;
SELECT `totalKills` FROM `characters`;


kBaTT 11.03.2010 17:12

Цитата:

Сообщение от Feel the Power (Сообщение 1369)
Код:

SELECT `totalHonorPoints` FROM `characters`;
SELECT `totalKills` FROM `characters`;


таких полей нет на 3.2.2 (ядро 9088)

Neggod 11.03.2010 17:18

Цитата:

Сообщение от kBaTT (Сообщение 1363)
Решил сделать статистику чести, но не знаю где в data хранятся очки чести (убийства тоже).
Зашел на Wiki мангоса, подходящего не нашел, а может плохо посмотрел.
Если можете подкиньте значения поля Data в таблице Characters.

http://ytdb.ru/showthread.php?t=653

mozilla 11.03.2010 17:41

Выводит гуид, имя и хонор 100 персов
PHP код:

SELECT `guid`, `name`, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' '1278), ' ', -1) AS UNSIGNED) AS `honorFROM `charactersORDER BY `honorDESC LIMIT 0,100

А так, обновляй серв, и будет у тебя
PHP код:

SELECT `totalHonorPointsFROM `characters`; 


Desperado 11.03.2010 21:41

Скриптик вывода запрщённых спелов.
Так как в базе я не нашёл названий спелов, а парсить - создавать лишний геморой, решил немного схитрить: взял названия из оружейной уважаемого Шадеза. В принципе, суть ясна и каждый может сделать по-своему.

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

Код:

<?php
 require_once ('includes/config.php');
            $sMySql = mysql_connect($host, $user, $passw) or die("Невозможно подключиться к базе данных : " . mysql_error());
            mysql_query('SET  character_set_database  =  cp1251');
            mysql_query('SET  NAMES  cp1251');                         
                        $content = mysql_query ("select sp.SpellName_ru_ru, id
                                      from armory.armory_spell sp
                                      join mangos.spell_disabled sd ON sp.id = sd.entry
                                      where sd.active = 1 or sd.ischeat_spell = 1");
                                              // строим таблицу
      $szTable = '<table border="1" align="center">';
          $szTable .= '<tr><td align="center">Название</td></tr>';
         
        while ($row = mysql_fetch_array($content))                         
                            {       
                                                        $SpellName_ru_ru = $row['SpellName_ru_ru'];
                                                        $Spellid = $row['id'];
                                                       
          $szTable .= '<tr><td align="center"><a href = "http://www.wowhead.com/?spell='.$Spellid.'" target = "_blank">'.$SpellName_ru_ru.'</a></td>';
                                          }
          $szTable .= '</table>';
      $szTable .= '<br>';
          $szTable .= '<br>';         
      $szTable .= '<div align="center"><font size="1">Список запрещённых заклинаний обновляется раз в 24 часа</font></div>';         
         
        $handler = fopen("spells.txt", "w+");
    fwrite($handler, $szTable);
    fclose($handler);
        mysql_close($sMySql);   
?>


Keni 13.03.2010 19:01

Цитата:

Сообщение от Yoda (Сообщение 328)
Аптайм:
PHP код:

<?
mysql_select_db 
("$mdb");
$uptime mysql_query ("select max(`starttime`) from `uptime`");
$uptime time()-mysql_result ($uptime,0);
$sec $uptime%60;
$uptime intval ($uptime/60);
$min $uptime%60;
$uptime intval ($uptime/60);
$hours $uptime;
echo 
"Uptime: $hours h $min min $sec sec<br>";
?>


Таблицу аптайма перенесли в реалмд
PHP код:

<?
mysql_select_db 
("$rdb");
$uptime mysql_query ("select max(`starttime`) from `uptime`");
$uptime time()-mysql_result ($uptime,0);
$sec $uptime%60;
$uptime intval ($uptime/60);
$min $uptime%60;
$uptime intval ($uptime/60);
$hours $uptime;
echo 
"Uptime: $hours h $min min $sec sec<br>";
?>


Keni 19.03.2010 19:10

Цитата:

Сообщение от Pro[100]Hens (Сообщение 1297)
Скрипт на лист банов.
(по IP и Аккаунтам)

config.php:
PHP код:

$host="localhost"// хост базы REALM
$user="mangos" // пользователь базы REALM
$password="mangos"// пароль базы REALM
$dbr="realmd"// название базы REALM 

bans.php
PHP код:

    <?php
// Скрипт показа забанненных аккаунтов и IP адресов by WoW-Ultimate
require_once "config.php";

//подключение к базе
$ConnectDB mysql_connect("$host""$user""$password") or die ("Нет соединения с MySQL");
mysql_select_db("$dbr") or die ("Нет соединения с базой $dbr");
echo 
"<h2>Забаненные аккаунты</h2>";
echo 
"<table width=\"100%\" border=\"1\" align=\"center\"><tr>
<td align=\"center\" width=\"20%\">забанен:</td>
<td align=\"center\" width=\"20%\">Бан установлен:</td>
<td align=\"center\" width=\"20%\">Забанил:</td>
<td align=\"center\" width=\"20%\">Причина:</td>
<td align=\"center\" width=\"20%\">Бан до:</td>
</tr></table>"
;
$i=0;
$data mysql_query("SELECT * FROM account_banned WHERE active = 1 ORDER BY bandate DESC LIMIT 100",$ConnectDB);
$row mysql_fetch_array($data***91;$i***93;); {
while(
$row mysql_fetch_array($data)) {
$banid $row***91;'id'***93;;
$usern mysql_query("SELECT * FROM account WHERE id= $banid LIMIT 1",$ConnectDB);
$rowuser mysql_fetch_array($usern);
$banuser $rowuser***91;'username'***93;;
$bandate date("H:i:s d.m.Y"$row***91;'bandate'***93;);
$bannedby $row***91;'bannedby'***93;;
$banreason $row***91;'banreason'***93;;
$unbandate date("H:i:s d.m.Y"$row***91;'unbandate'***93;);
echo 
"<font color=\"beer\">
<table width=\"100%\" border=\"1\" align=\"center\"><tr>
<td align=\"center\" width=\"20%\">
$banuser</td>
<td align=\"center\" width=\"20%\">
$bandate г.</td>
<td align=\"center\" width=\"20%\">
$bannedby</td>
<td align=\"center\" width=\"20%\">
$banreason</td>
<td align=\"center\" width=\"20%\">
$unbandate г.</td>
</tr></table></font>"
;
$i++;
}
}
//теперь выборка по IP адресам
echo "<h2>БАНЫ по IP </h2><br>";
echo 
"<table width=\"100%\" border=\"1\" align=\"center\"><tr>
<td align=\"center\" width=\"20%\">IP:</td>
<td align=\"center\" width=\"20%\">Бан установлен:</td>
<td align=\"center\" width=\"20%\">Забанил:</td>
<td align=\"center\" width=\"20%\">Причина:</td>
<td align=\"center\" width=\"20%\">Бан до:</td>
</tr></table>"
;
$u=0;
$bannedip mysql_query("SELECT * FROM ip_banned ORDER BY bandate DESC LIMIT 100");
$row mysql_fetch_array($bannedip***91;$u***93;); {
while(
$row mysql_fetch_array($bannedip)) {

$banip $row***91;'ip'***93;;
$bandate date("H:i:s d.m.Y"$row***91;'bandate'***93;);
$bannedby $row***91;'bannedby'***93;;
$banreason $row***91;'banreason'***93;;
$unbandate date("H:i:s d.m.Y"$row***91;'unbandate'***93;);
echo 
"<font color=\"beer\">
<table width=\"100%\"border=\"1\" align=\"center\"><tr>
<td align=\"center\" width=\"20%\">
$banip</td>
<td align=\"center\" width=\"20%\">
$bandate г.</td>
<td align=\"center\" width=\"20%\">
$bannedby</td>
<td align=\"center\" width=\"20%\">
$banreason</td>
<td align=\"center\" width=\"20%\">
$unbandate г.</td>
</tr></table></font>"
;
$u++;
}
}
?>


Код:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
Ошибка вылазит=\

DeusModus 19.03.2010 20:56

Цитата:

Сообщение от Keni (Сообщение 2667)
Код:

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
Ошибка вылазит=\


Ищем

А вообще подобные проблемы возникают из за нежелания пользователей включать error_reporting в E_ALL и *нописателей включать конструкции OR DIE().
Дебажить подобную хрень удовольствия никакого.

StinK 26.03.2010 21:31

Как высчитать положение игрока? Ну т.е. локацию, где он находится.

Shadez 26.03.2010 22:19

`characters`.`zone`. Названия зон - в AreaTable.dbc

StinK 11.04.2010 20:58

Вложений: 3
Цитата:

Сообщение от Shadez (Сообщение 3237)
`characters`.`zone`. Названия зон - в AreaTable.dbc

А как перегнать всё к виду 1 => DunMorogh?
-----------
Ага, придумал! Перегнал AreaTable.dbc в sql, залил куда пологается и выбрал значения из field1(номер локации) и field12/field20(название локации), поставив между ними =>. И потом через браузер всё это дело выделил и скопировал в блокнот :)
Кому нужен весь список зон для 3.3.2 - забирайте!

Праведник 12.04.2010 18:02

Цитата:

Сообщение от DeusModus (Сообщение 364)
20 запросов к БД.. Ассоциативные массивы автору сего чуда были неведомы.


А как всёже правильно будет вывести статистику по количеству игроков каждого класса? Что-то не особо выходит не плодя десятки запросов...

StinK 12.04.2010 18:24

Думаю поможет http://pranivpro.narod.ru/PHP/array.htm

saint diablo 12.04.2010 19:08

Цитата:

Сообщение от Праведник (Сообщение 4363)
А как всёже правильно будет вывести статистику по количеству игроков каждого класса? Что-то не особо выходит не плодя десятки запросов...

интересно, а через group by не получится??
просто мне как-то не доставляет удовольствия прогонять один и тот же запрос в цикле 10 раз

ghostpast 12.04.2010 19:36

Цитата:

Сообщение от StinK (Сообщение 4296)
А как перегнать всё к виду 1 => DunMorogh?
-----------
Ага, придумал! Перегнал AreaTable.dbc в sql, залил куда пологается и выбрал значения из field1(номер локации) и field12/field20(название локации), поставив между ними =>. И потом через браузер всё это дело выделил и скопировал в блокнот :)
Кому нужен весь список зон для 3.3.2 - забирайте!

зачем так извращаться то?
Достаточно AreaTable.dbc перевести в SQL (например таблица area с полями id и name), а потом написать запрос.

Запрос для получения списка персонажей и названия зон, в которых они находятся:

SELECT characters.name, area.name
FROM area, characters
WHERE characters.zone = area.id;


Запрос для получения списка зон:

SELECT id, name
FROM area;


Результат запроса обрабатывать функцией mysql_fetch_array(), которая вернет готовый ассоциативный массив

Цитата:

Сообщение от saint diablo (Сообщение 4368)
интересно, а через group by не получится??
просто мне как-то не доставляет удовольствия прогонять один и тот же запрос в цикле 10 раз

получится, если грамотно запрос писать

StinK 12.04.2010 20:16

Цитата:

Сообщение от ghostpast (Сообщение 4369)
зачем так извращаться то?
Достаточно AreaTable.dbc перевести в SQL (например таблица area с полями id и name), а потом написать запрос.

Запрос для получения списка персонажей и названия зон, в которых они находятся:

SELECT characters.name, area.name
FROM area, characters
WHERE characters.zone = area.id;


Запрос для получения списка зон:

SELECT id, name
FROM area;


Результат запроса обрабатывать функцией mysql_fetch_array(), которая вернет готовый ассоциативный массив

Учту на будущее. Но на тот момент как придумал, так и сделал :pardon:
Да и зачем лишний раз обращаться к БД?

ghostpast 12.04.2010 20:44

Цитата:

Сообщение от StinK (Сообщение 4372)
Да и зачем лишний раз обращаться к БД?

можно сделать кеширование результатов запроса и обновлять кеш через определенное время


Текущее время: 09:56. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS