LOCALE_WARRIOR,
2 => LOCALE_PALADIN,
3 => LOCALE_HUNTER,
4 => LOCALE_ROGUE,
5 => LOCALE_PRIEST,
6 => LOCALE_DEATH_KNIGHT,
7 => LOCALE_SHAMAN,
8 => LOCALE_MAGE,
9 => LOCALE_WARLOCK,
11 => LOCALE_DRUID
);
define ("RACE_HUMAN", 1);
define ("RACE_ORC", 2);
define ("RACE_DWARF", 4);
define ("RACE_NIGHTELF", 8);
define ("RACE_UNDEAD", 16);
define ("RACE_TAUREN", 32);
define ("RACE_GNOME", 64);
define ("RACE_TROLL", 128);
define ("RACE_BLOODELF", 512);
define ("RACE_DRAENEI", 1024);
// Типы разделов
global $types;
$types = array(
1 => 'npc',
2 => 'object',
3 => 'item',
4 => 'itemset',
5 => 'quest',
6 => 'spell',
7 => 'zone',
8 => 'faction'
);
// Отношения со фракциями
$reputations = array(
1 => LOCALE_NEUTRAL,
3000 => LOCALE_FRIENDLY,
9000 => LOCALE_HONORED,
21000 => LOCALE_REVERED,
42000 => LOCALE_EXALTED
);
function sec_to_time($secs)
{
$time = array();
if ($secs>=3600)
{
$time['h'] = floor($secs/3600);
$secs = $secs - $time['h']*3600;
}
if ($secs>=60)
{
$time['m'] = floor($secs/60);
$secs = $secs - $time['m']*60;
}
if ($secs>0)
$time['s'] = $secs;
return $time;
}
function money2coins($money)
{
$coins = array();
if ($money>=10000)
{
$coins['moneygold'] = floor($money/10000);
$money = $money - $coins['moneygold']*10000;
}
if ($money>=100)
{
$coins['moneysilver'] = floor($money/100);
$money = $money - $coins['moneysilver']*100;
}
if ($money>0)
$coins['moneycopper'] = $money;
return $coins;
}
// Классы, для которых предназначена вещь
function classes($class)
{
$tmp = '';
if ($class & CLASS_WARRIOR)
$tmp = LOCALE_WARRIOR;
if ($class & CLASS_PALADIN)
if ($tmp) $tmp = $tmp.', '.LOCALE_PALADIN; else $tmp = LOCALE_PALADIN;
if ($class & CLASS_HUNTER)
if ($tmp) $tmp = $tmp.', '.LOCALE_HUNTER; else $tmp = LOCALE_HUNTER;
if ($class & CLASS_ROGUE)
if ($tmp) $tmp = $tmp.', '.LOCALE_ROGUE; else $tmp = LOCALE_ROGUE;
if ($class & CLASS_PRIEST)
if ($tmp) $tmp = $tmp.', '.LOCALE_PRIEST; else $tmp = LOCALE_PRIEST;
if ($class & CLASS_SHAMAN)
if ($tmp) $tmp = $tmp.', '.LOCALE_SHAMAN; else $tmp = LOCALE_SHAMAN;
if ($class & CLASS_MAGE)
if ($tmp) $tmp = $tmp.', '.LOCALE_MAGE; else $tmp = LOCALE_MAGE;
if ($class & CLASS_WARLOCK)
if ($tmp) $tmp = $tmp.', '.LOCALE_WARLOCK; else $tmp = LOCALE_WARLOCK;
if ($class & CLASS_DRUID)
if ($tmp) $tmp = $tmp.', '.LOCALE_DRUID; else $tmp = LOCALE_DRUID;
if ($tmp == LOCALE_WARRIOR.', '.LOCALE_PALADIN.', '.LOCALE_HUNTER.', '.LOCALE_ROGUE
.', '.LOCALE_PRIEST.', '.LOCALE_SHAMAN.', '.LOCALE_MAGE.', '.LOCALE_WARLOCK.', '.LOCALE_DRUID)
return;
else
return $tmp;
}
function races($race)
{
// Простые варианты:
if($race == RACE_HUMAN|RACE_ORC|RACE_DWARF|RACE_NIGHTELF|RACE_UNDEAD|RACE_TAUREN|RACE_GNOME|RACE_TROLL|RACE_BLOODELF|RACE_DRAENEI || $race == 0)
return array('side' => 3, 'name' => LOCALE_BOTH);
elseif($race == RACE_ORC|RACE_UNDEAD|RACE_TAUREN|RACE_TROLL|RACE_BLOODELF)
return array('side' => 2, 'name' => LOCALE_HORDE);
elseif($race == RACE_HUMAN|RACE_DWARF|RACE_NIGHTELF|RACE_GNOME|RACE_DRAENEI)
return array('side' => 1, 'name' => LOCALE_ALLIANCE);
else
{
$races = array('name' => '', 'side' => 0);
if ($race & RACE_HUMAN)
{
(($races['side']==2) or ($races['side']==3))? $races['side']=3 : $races['side']=1;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_HUMAN;
}
if ($race & RACE_ORC)
{
(($races['side']==1) or ($races['side']==3))? $races['side']=3 : $races['side']=2;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_ORC;
}
if ($race & RACE_DWARF)
{
(($races['side']==2) or ($races['side']==3))? $races['side']=3 : $races['side']=1;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_DWARF;
}
if ($race & RACE_NIGHTELF)
{
(($races['side']==2) or ($races['side']==3))? $races['side']=3 : $races['side']=1;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_NIGHT_ELF;
}
if ($race & RACE_UNDEAD)
{
(($races['side']==1) or ($races['side']==3))? $races['side']=3 : $races['side']=2;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_UNDEAD;
}
if ($race & RACE_TAUREN)
{
(($races['side']==1) or ($races['side']==3))? $races['side']=3 : $races['side']=2;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_TAUREN;
}
if ($race & RACE_GNOME)
{
(($races['side']==2) or ($races['side']==3))? $races['side']=3 : $races['side']=1;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_GNOME;
}
if ($race & RACE_TROLL)
{
(($races['side']==1) or ($races['side']==3))? $races['side']=3 : $races['side']=2;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_TROLL;
}
if ($race & RACE_BLOODELF)
{
(($races['side']==1) or ($races['side']==3))? $races['side']=3 : $races['side']=2;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_BLOOD_ELF;
}
if ($race & RACE_DRAENEI)
{
(($races['side']==2) or ($races['side']==3))? $races['side']=3 : $races['side']=1;
if ($races['name']) $races['name'] .= ', '; $races['name'] .= LOCALE_DRAENEI;
}
return $races;
}
}
function sum_subarrays_by_key( $tab, $key ) {
$sum = 0;
foreach($tab as $sub_array) {
$sum += $sub_array[$key];
}
return $sum;
}
function coord_mangos2wow($mapid, $x, $y, $global)
{
// Карты
global $map_images;
// Подключение к базе
global $DB;
$rows = $DB->select("SELECT * FROM ?_zones WHERE (mapID=? and x_min and x_max>? and y_min and y_max>?)", $mapid, $x, $x, $y, $y);
foreach ($rows as $numRow=>$row) {
// Сохраяняем имя карты и координаты
$wow['zone'] = $row['areatableID'];
$wow['name'] = $row['name'];
// Т.к. в игре координаты начинают отсчёт с левого верхнего угла
// а в системе координат сервера с правого нижнего,
// делаем соответствующее преобразование.
$tx = 100 - ($y - $row["y_min"]) / (($row["y_max"] - $row["y_min"]) / 100);
$ty = 100 - ($x - $row["x_min"]) / (($row["x_max"] - $row["x_min"]) / 100);
// А если ещё и с цветом совпала - нах цикл, это всё наше :) Оо
// Если ещё не загружена - загружаем.
if (!isset($map_images[$wow['zone']])) {
$mapname = str_replace("\\", "/", getcwd()).'/images/tmp/'.$row['areatableID'].'.png';
if (file_exists($mapname)) {
$map_images[$wow['zone']] = @ImageCreateFromPNG($mapname);
} else {
echo "....Map $mapname not found (ID=".$wow['zone'].")
";
}
}
// Если так и не загрузилась... Возможно такой карты ещё просто нету :)
if ($map_images[$wow['zone']]) {
if (@ImageColorAt($map_images[$wow['zone']], round($tx * 10), round($ty * 10)) === 0) {
break;
}
}
}
if (count($rows)==0)
{
// Ничего не найдено. Мб инста??
$row = $DB->selectRow("SELECT * FROM ?_zones WHERE (mapID=? and x_min=0 and x_max=0 and y_min=0 and y_max=0)", $mapid);
if ($row) {
$wow['zone'] = $row['areatableID'];
$wow['name'] = $row['name'];
} else {
echo "....Location for Map with ID=$mapid not found
";
return;
}
}
// округляем до 2 цифер после запятой
// почему до 2?
if (isset($tx, $ty)) {
$wow["x"] = /*round(*/$tx;//, 2);
$wow["y"] = /*round(*/$ty;//, 2);
}
return $wow;
}
// Преобразование целого массива координат
// Всегда пользовацца только им!
function mass_coord(&$data)
{
// Карты
global $map_images;
// Объявляем новый массив с преобразованными данными
$xdata = array();
// Перебираем по порядку все координаты, посланные функции
// Если таких же координат (уже преобразованных) ещё нет, добавляем в новый массив
foreach ($data as $ndata) {
// Если помимо координат есть ещё данные о респауне, преобразуем их к удобочитаемому виду:
if (isset($ndata['spawntimesecs']))
$tmp = array_merge(coord_mangos2wow($ndata['m'], $ndata['x'], $ndata['y'], false), array('r' => sec_to_time($ndata['spawntimesecs'])));
else
$tmp = coord_mangos2wow($ndata['m'], $ndata['x'], $ndata['y'], false);
$xdata[] = $tmp;
}
// Освобождаем всю память выделенную под карты
if ($map_images)
foreach ($map_images as $map_image)
imagedestroy($map_image);
// Возвращаем новый массив
return $xdata;
}
// Функция информации о фракции
function factioninfo($id)
{
global $DB;
$row = $DB->selectRow("SELECT name FROM ?_factions WHERE factionID = ?d LIMIT 1", $id);
$faction['name'] = $row['name'];
$faction['entry'] = $id;
return $faction;
}
// Function, that creates loot_table (without references) from lootid
// $table - table, in which we search
// $lootid - loot ident
// $repetition_factor - repetition factor
function loot_table($table, $lootid, $max_percent=100)
{
// Все элементы
global $DB;
global $loot_groups;
global $item_cols;
$loot = array();
$groups = array();
// Мего запрос :)
$rows = $DB->select('
SELECT l.ChanceOrQuestChance, l.mincountOrRef, l.maxcount as `d-max`, l.groupid, ?#, i.entry, i.maxcount
{, loc.name_loc?d AS `name_loc`}
FROM ?# l
LEFT JOIN (?_icons a, item_template i) ON l.item=i.entry AND a.id=i.displayid
{LEFT JOIN (locales_item loc) ON loc.entry=i.entry AND ?d}
WHERE
l.entry=?d
{LIMIT ?d}
',
$item_cols[2],
($_SESSION['locale'])? $_SESSION['locale']: DBSIMPLE_SKIP,
$table,
($_SESSION['locale'])? 1: DBSIMPLE_SKIP,
$lootid,
($AoWoWconf['limit']!=0)? $AoWoWconf['limit']: DBSIMPLE_SKIP
);
// Перебираем
foreach ($rows as $i => $row)
{
if ($row['mincountOrRef']>0)
{
// Не ссылка!
if ($row['groupid']>0)
{
// Групповой лут!
$groups[$row['groupid']][] = array(
'mincount' => $row['mincountOrRef'],
'maxcount' => $row['d-max'],
'percent' => $row['ChanceOrQuestChance']*$max_percent/100,
'item' => iteminfo2($row,0)
);
// Общее число элементов группы с равнозначным шансом
if (!(IsSet($group_idx[$row['groupid']]['num-equal'])))
$group_idx[$row['groupid']]['num-equal'] = 0;
// Общий шанс дропа для группового лута
if (!(IsSet($group_idx[$row['groupid']]['percent'])))
$group_idx[$row['groupid']]['percent'] = 0;
// Если шанс дропа=0, значит это равнозначный лут в группе
// Иначе, увеличиваем зарезервированный шанс для элементов лута с четко определенным шансом дропа
if ($row['ChanceOrQuestChance']==0)
$group_idx[$row['groupid']]['num-equal'] ++;
else
$group_idx[$row['groupid']]['percent'] += abs($row['ChanceOrQuestChance']);
} else {
// Старый добрый обычный лут :)
$loot[] = array_merge(array(
'percent' => ($max_percent!=100)? $max_percent : $row['ChanceOrQuestChance'],
'mincount' => $row['mincountOrRef'],
'maxcount' => $row['d-max'],
'group' => 0
), iteminfo2($row, 0));
}
} else {
// Ссылка!
// Вот если это ссылка, то ######
// Наша задача - вызвать эту же функцию, но с предопределенным значением percent и maxcount
for ($j=1;$j<=$row['d-max'];$j++)
$loot = array_merge($loot, loot_table($table, -$row['mincountOrRef'], $row['ChanceOrQuestChance']));
}
}
// Перебираем группы лута
foreach ($groups as $groupid => $group)
{
foreach($group as $field => $group_item)
{
if(isset($group_item['item']))
$loot[] = array_merge(array(
'mincount' => $group_item['mincount'],
'maxcount' => $group_item['maxcount'],
'percent' => ($group_item['percent']==0)? (($max_percent-$group_idx[$groupid]['percent'])/$group_idx[$groupid]['num-equal']) : $group_item['percent'],
'group' => $loot_groups,
'grouppercent' => ($group_idx[$groupid]['num-equal']>0)? $max_percent : $group_idx[$groupid]['percent']
), $group_item['item']);
}
$loot_groups++;
}
return $loot;
}
function loot($table, $lootid)
{
global $loot_groups;
$loot_groups=1;
$loot = loot_table($table, $lootid);
return $loot;
}
// Кто дропает
function drop($table, $item)
{
global $DB;
$rows = $DB->select('
SELECT l.ChanceOrQuestChance, l.mincountOrRef, l.maxcount, l.entry
FROM ?# l
WHERE
l.item=?
{LIMIT ?d}
',
$table,
$item,
($AoWoWconf['limit']!=0)? $AoWoWconf['limit']: DBSIMPLE_SKIP
);
$drop = array();
foreach ($rows as $i => $row)
{
if ($row['mincountOrRef'] > 0)
{
$num = $row['entry'];
$drop[$num] = array();
$drop[$num]['percent'] = abs($row['ChanceOrQuestChance']);
$drop[$num]['mincount'] = $row['mincountOrRef'];
$drop[$num]['maxcount'] = $row['maxcount'];
// Ищем лут, который ссылается на этот лут
$refrows = $DB->select('SELECT entry FROM ?# WHERE mincountOrRef=? LIMIT 200',$table, -$num);
foreach ($refrows as $i => $refrow)
{
$num = $refrow['entry'];
$drop[$num] = array();
$drop[$num]['percent'] = abs($row['ChanceOrQuestChance']);
$drop[$num]['mincount'] = $row['mincountOrRef'];
$drop[$num]['maxcount'] = $row['maxcount'];
}
}
}
return $drop;
}
// позиция
function position($data)
{
global $smarty, $exdata, $zonedata;
if(count($data) > 0)
{
$data = mass_coord($data);
// Сортируем массив. Зачем???
if($data)
sort($data);
// Во временную переменную tmp заносим номер локации
$j = 0;
$tmp = $data[$j]['zone'];
// Номер массива
$n = 0;
$k = 0;
$zonedata[$n] = array();
$zonedata[$n]['zone'] = $data[$j]['zone'];
$zonedata[$n]['name'] = $data[$j]['name'];
for($j=0; $j $zonedata[$i]['count'])
{
unset($tmp);
$tmp = $zonedata[$i];
$zonedata[$i] = $zonedata[$j];
$zonedata[$j] = $tmp;
unset($tmp);
$tmp = $exdata[$i];
$exdata[$i] = $exdata[$j];
$exdata[$j] = $tmp;
}
}
}
$smarty->assign('zonedata',$zonedata);
$smarty->assign('exdata',$exdata);
}
}
?>