config_load($conf_file,'spell'); // номер спелла; $id = $podrazdel; if(!$spell = load_cache(13, intval($id))) { unset($spell); // БД global $DB; // Таблица спеллов global $allspells; // Таблица вещей global $allitems; global $npc_cols; // Данные об спелле: $row = $DB->selectRow(' SELECT s.*, i.iconname FROM ?_spell s, ?_spellicons i WHERE s.spellID=? AND i.id = s.spellicon ', $id ); if ($row) { $spell = array(); // Номер спелла $spell['entry'] = $row['spellID']; // Имя спелла $spell['name'] = $row['spellname']; // Иконка спелла //$spell['icon'] = $row['iconname']; // Затраты маны на сспелл if ($row['manacost']) $spell['manacost'] = $row['manacost']; elseif ($row['manacostpercent']) $spell['manacost'] = $row['manacostpercent'].'% '.$smarty->get_config_vars('of_base'); // Уровень спелла $spell['level'] = $row['levelspell']; // Дальность $RangeRow = $DB->selectRow('SELECT rangeMin, rangeMax, name from ?_spellrange where rangeID=? limit 1', $row['rangeID']); $spell['range'] = ''; if (($RangeRow['rangeMin'] != $RangeRow['rangeMax']) and ($RangeRow['rangeMin'] != 0)) $spell['range'] = $RangeRow['rangeMin'].'-'; $spell['range'] .= $RangeRow['rangeMax']; $spell['rangename'] = $RangeRow['name']; // Время каста $casttime = $DB->selectCell('SELECT base from ?_spellcasttimes where id=? limit 1', $row['spellcasttimesID']); if ($casttime>0) $spell['casttime'] = ($casttime/1000).' '.$smarty->get_config_vars('seconds'); else if($row['ChannelInterruptFlags']) $spell['casttime'] = 'Channeled'; else $spell['casttime'] = 'Instant'; // Cooldown if ($row['cooldown']>0) $spell['cooldown'] = $row['cooldown'] / 1000; // Время действия спелла $duration = $DB->selectCell('SELECT durationBase FROM ?_spellduration WHERE durationID=?d LIMIT 1', $row['durationID']); if ($duration > 0) $spell['duration'] = ($duration/1000).' '.$smarty->get_config_vars('seconds'); else $spell['duration'] ='n/a'; // Школа спелла $spell['school'] = $DB->selectCell('SELECT name FROM ?_resistances WHERE id=?d LIMIT 1', $row['resistancesID']); // Тип диспела if ($row['dispeltypeID']) $spell['dispel'] = $DB->selectCell('SELECT name FROM ?_spelldispeltype WHERE id=?d LIMIT 1', $row['dispeltypeID']); // Механика спелла if ($row['mechanicID']) $spell['mechanic'] = $DB->selectCell('SELECT name FROM ?_spellmechanic WHERE id=?d LIMIT 1', $row['mechanicID']); // Информация о спелле $spell['info'] = allspellsinfo2($row, 2); // Инструменты $spell['tools'] = array(); $i=0; for ($j=1;$j<=2;$j++) { if ($row['tool'.$j]) { $spell['tools'][$i] = array(); // Имя инструмента $tool_row = $DB->selectRow('SELECT ?#, `name`, `quality` FROM item_template, ?_icons WHERE entry=?d AND id=displayid LIMIT 1', $item_cols[0], $row['tool'.$j]); $spell['tools'][$i]['name'] = $tool_row['name']; $spell['tools'][$i]['quality'] = $tool_row['quality']; // ID инструмента $spell['tools'][$i]['entry'] = $row['tool'.$j]; // Добавляем инструмент в таблицу вещей allitemsinfo2($tool_row, 0); $i++; } } // Реагенты $spell['reagents'] = array(); $i=0; for ($j=1;$j<=8;$j++) { if ($row['reagent'.$j]) { $spell['reagents'][$i] = array(); // Имя реагента $reagentrow = $DB->selectRow(' SELECT c.?#, name { ,l.name_loc?d as `name_loc` } FROM ?_icons, item_template c { LEFT JOIN (locales_item l) ON l.entry=c.entry AND ? } WHERE c.entry=?d AND id=displayid LIMIT 1 ', $item_cols[0], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $row['reagent'.$j] ); $spell['reagents'][$i]['name'] = !empty($reagentrow['name_loc'])?$reagentrow['name_loc']:$reagentrow['name']; $spell['reagents'][$i]['quality'] = $reagentrow['quality']; // ID реагента $spell['reagents'][$i]['entry'] = $row['reagent'.$j]; // Количество реагентов $spell['reagents'][$i]['count'] = $row['reagentcount'.$j]; // Добавляем реагент в таблицу вещей allitemsinfo2($reagentrow, 0); $i++; } } // Перебираем все эффекты: $i=0; $spell['effect'] = array(); // Btt - Buff TollTip if ($row['buff']) $spell['btt'] = spell_buff_render($row); for ($j=1;$j<=3;$j++) { if($row['effect'.$j.'id'] > 0) { // Название эффекта $spell['effect'][$i]['name'] = $spell_effect_names[$row['effect'.$j.'id']]; // Доп информация в имени if ($row['effect'.$j.'MiscValue']) { switch ($row['effect'.$j.'id']) { // Если эффект - создание обекта, создаем информацию о нём case 50: // "Summon Object" // 103 spells, OK case 76: // "Summon Object (Wild)" // 173 spells, OK //case 86: // "Activate Object" // 175 spells; wrong GOs, tiny ID; skipping case 104: // "Summon Object (slot 1)" // 24 spells - traps, OK //case 105: // "Summon Object (slot 2)" // 2 spells: 22996, 23005; wrong GOs; skipping //case 106: // "Summon Object (slot 3)" // 0 spells; skipping //case 107: // "Summon Object (slot 4)" // 0 spells; skipping { $spell['effect'][$i]['object'] = array(); $spell['effect'][$i]['object']['entry'] = $row['effect'.$j.'MiscValue']; $spell['effect'][$i]['object']['name'] = $DB->selectCell("SELECT name FROM gameobject_template WHERE entry=? LIMIT 1", $spell['effect'][$i]['object']['entry']).' ('.$spell['effect'][$i]['object']['entry'].')'; break; } // скиллы case 118: // "Require Skill" { $spell['effect'][$i]['name'] .= ' ('.$DB->selectCell('SELECT name FROM ?_skill WHERE skillID=? LIMIT 1', $row['effect'.$j.'MiscValue']).')'; break; } // ауры case 6: { break; } // тотемы case 75: // "Summon Totem" case 87: // "Summon Totem (slot 1)" case 88: // "Summon Totem (slot 2)" case 89: // "Summon Totem (slot 3)" case 90: // "Summon Totem (slot 4)" { $spell['effect'][$i]['name'] .= ' ('.$row['effect'.$j.'MiscValue'].')'; break; } default: { $spell['effect'][$i]['name'] .= ' ('.$row['effect'.$j.'MiscValue'].')'; } } } // Если просто урон школой - добавляем подпись школы if ($row['effect'.$j.'id'] == 2 && $spell['school']) $spell['effect'][$i]['name'] .= ' ('.$spell['school'].')'; // Радиус действия эффекта if ($row['effect'.$j.'radius']) $spell['effect'][$i]['radius'] = $DB->selectCell("SELECT radiusbase from ?_spellradius where radiusID=? limit 1", $row['effect'.$j.'radius']); // Значение спелла (урон) if ($row['effect'.$j.'BasePoints'] && !$row['effect'.$j.'itemtype']) $spell['effect'][$i]['value'] = $row['effect'.$j.'BasePoints'] + 1; // Интервал действия спелла if ($row['effect'.$j.'Amplitude'] > 0) $spell['effect'][$i]['interval'] = $row['effect'.$j.'Amplitude'] / 1000; // Название ауры: if ($row['effect'.$j.'Aura'] > 0 && IsSet($spell_aura_names[$row['effect'.$j.'Aura']])) switch ($row['effect'.$j.'Aura']) { case 78: // "Mounted" - приписываем ссылку на нпс case 56: // "Transform" { $spell['effect'][$i]['name'] .= ': '.$spell_aura_names[$row['effect'.$j.'Aura']].' ('.$row['effect'.$j.'MiscValue'].')'; break; } default: { $spell['effect'][$i]['name'] .= ': '.$spell_aura_names[$row['effect'.$j.'Aura']]; if($row['effect'.$j.'MiscValue'] > 0) $spell['effect'][$i]['name'] .= ' ('.$row['effect'.$j.'MiscValue'].')'; } } elseif ($row['effect'.$j.'Aura'] > 0) $spell['effect'][$i]['name'] .= ': Unknown_Aura('.$row['effect'.$j.'Aura'].')'; // Создает вещь: if (($row['effect'.$j.'id'] == 24)) { $spell['effect'][$i]['item'] = array(); $spell['effect'][$i]['item']['entry'] = $row['effect'.$j.'itemtype']; $tmpRow = $DB->selectRow(' SELECT c.?#, name { ,l.name_loc?d as `name_loc` } FROM ?_icons, item_template c { LEFT JOIN (locales_item l) ON l.entry=c.entry AND ? } WHERE c.entry=?d AND id=displayid LIMIT 1 ', $item_cols[0], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $spell['effect'][$i]['item']['entry'] ); $spell['effect'][$i]['item']['name'] = $tmpRow['name']; $spell['effect'][$i]['item']['quality'] = $tmpRow['quality']; $spell['effect'][$i]['item']['count'] = $row['effect'.$j.'BasePoints'] + 1; // Иконка итема, если спелл создает этот итем if(!IsSet($spell['icon'])) $spell['icon'] = $tmpRow['iconname']; allitemsinfo2($tmpRow, 0); } // Создает спелл if ($row['effect'.$j.'triggerspell'] > 0) { $spell['effect'][$i]['spell'] = array(); $spell['effect'][$i]['spell']['entry'] = $row['effect'.$j.'triggerspell']; $spell['effect'][$i]['spell']['name'] = $DB->selectCell('SELECT spellname FROM ?_spell WHERE spellID=?d LIMIT 1', $spell['effect'][$i]['spell']['entry']); allspellsinfo($spell['effect'][$i]['spell']['entry']); } $i++; } } if(!IsSet($spell['icon'])) $spell['icon'] = $row['iconname']; // Спеллы с таким же названием $seealso = $DB->select(' SELECT s.*, i.iconname FROM ?_spell s, ?_spellicons i WHERE s.spellname=? AND s.spellID!=?d AND ( (s.effect1id=?d AND s.effect1id!=0) OR (s.effect2id=?d AND s.effect2id!=0) OR (s.effect3id=?d AND s.effect3id!=0) ) AND i.id=s.spellicon ', $spell['name'], $spell['entry'], $row['effect1id'], $row['effect2id'], $row['effect3id'] ); if ($seealso) { $spell['seealso'] = array(); foreach($seealso as $i => $row) $spell['seealso'][] = spellinfo2($row); unset ($seealso); } // Кто обучает этому спеллу $spell['taughtbynpc'] = array(); // Список тренеров, обучающих нужному спеллу $taughtbytrainers = $DB->select(' SELECT ?#, c.entry { , name_loc?d AS name_loc, subname_loc'.$_SESSION['locale'].' AS subname_loc } FROM ?_factiontemplate, creature_template c { LEFT JOIN (locales_creature l) ON c.entry = l.entry AND ? } WHERE c.entry IN (SELECT entry FROM npc_trainer WHERE spell=?d) AND factiontemplateID=faction_A ', $npc_cols[0], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $spell['entry'] ); if ($taughtbytrainers) { foreach($taughtbytrainers as $i=>$npcrow) $spell['taughtbynpc'][] = creatureinfo2($npcrow); unset ($taughtbytrainers); } // Список книг/рецептов, просто обучающих спеллу $spell['taughtbyitem'] = array(); $taughtbyitem = $DB->select(' SELECT ?#, c.entry { , name_loc?d AS name_loc } FROM ?_icons, item_template c { LEFT JOIN (locales_item l) ON c.entry = l.entry AND ? } WHERE ((spellid_2=?d) AND (spelltrigger_2=6)) AND id=displayid ', $item_cols[2], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $spell['entry']//, $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'] ); if ($taughtbyitem) { foreach($taughtbyitem as $i=>$itemrow) $spell['taughtbyitem'][] = iteminfo2($itemrow, 0); unset ($taughtbyitem); } // Список спеллов, обучающих этому спеллу: $taughtbyspells = $DB->selectCol(' SELECT spellID FROM ?_spell WHERE (effect1triggerspell=?d AND (effect1id=57 OR effect1id=36)) OR (effect2triggerspell=?d AND (effect2id=57 OR effect2id=36)) OR (effect3triggerspell=?d AND (effect3id=57 OR effect3id=36)) ', $spell['entry'], $spell['entry'], $spell['entry'] ); if ($taughtbyspells) { // Список петов, кастующих спелл, обучающий нужному спеллу $taughtbypets = $DB->select(' SELECT ?#, c.entry { , name_loc?d AS name_loc, subname_loc'.$_SESSION['locale'].' AS subname_loc } FROM ?_factiontemplate, creature_template c { LEFT JOIN (locales_creature l) ON c.entry = l.entry AND ? } WHERE c.entry IN (SELECT entry FROM petcreateinfo_spell WHERE (Spell1 IN (?a)) OR (Spell2 IN (?a)) OR (Spell3 IN (?a)) OR (Spell4 IN (?a))) AND factiontemplateID=faction_A ', $npc_cols[0], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $taughtbyspells, $taughtbyspells, $taughtbyspells, $taughtbyspells ); // Перебираем этих петов if ($taughtbypets) { foreach($taughtbypets as $i=>$petrow) $spell['taughtbynpc'][] = creatureinfo2($petrow); unset ($taughtbypets); } // Список квестов, наградой за которые является спелл, обучающий нужному спеллу $taughtbyquest = $DB->select(' SELECT c.?# { , Title_loc?d AS Title_loc } FROM quest_template c { LEFT JOIN (locales_quest l) ON c.entry = l.entry AND ? } WHERE RewSpell IN (?a) OR RewSpellCast IN (?a) ', $quest_cols[2], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $taughtbyspells, $taughtbyspells ); if ($taughtbyquest) { $spell['taughtbyquest'] = array(); foreach($taughtbyquest as $i=>$questrow) $spell['taughtbyquest'][] = GetQuestInfo($questrow, 0xFFFFFF); unset ($taughtbyquest); } // Список НПЦ, кастующих нужный спелл, бла-бла-бла $taughtbytrainers = $DB->select(' SELECT ?#, c.entry { , name_loc?d AS name_loc, subname_loc'.$_SESSION['locale'].' AS subname_loc } FROM ?_factiontemplate, creature_template c { LEFT JOIN (locales_creature l) ON c.entry = l.entry AND ? } WHERE c.entry IN (SELECT entry FROM npc_trainer WHERE spell in (?a)) AND factiontemplateID=faction_A ', $npc_cols[0], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $taughtbyspells ); if ($taughtbytrainers) { foreach($taughtbytrainers as $i=>$npcrow) $spell['taughtbynpc'][] = creatureinfo2($npcrow); unset ($taughtbytrainers); } // Список книг, кастующих спелл, обучающий нужному спеллу $taughtbyitem = $DB->select(' SELECT ?#, c.entry { , name_loc?d AS name_loc } FROM ?_icons, item_template c { LEFT JOIN (locales_item l) ON c.entry = l.entry AND ? } WHERE ((spellid_1 IN (?a)) OR (spellid_2 IN (?a)) OR (spellid_3 IN (?a)) OR (spellid_4 IN (?a)) OR (spellid_5 IN (?a))) AND id=displayid ', $item_cols[2], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $taughtbyspells, $taughtbyspells, $taughtbyspells, $taughtbyspells, $taughtbyspells ); if ($taughtbyitem) { foreach($taughtbyitem as $i=>$itemrow) $spell['taughtbyitem'][] = iteminfo2($itemrow, 0); unset ($taughtbyitem); } } // Используется NPC: $usedbynpc = $DB->select(' SELECT ?#, c.entry { , name_loc?d AS name_loc, subname_loc'.$_SESSION['locale'].' AS subname_loc } FROM ?_factiontemplate, creature_template c { LEFT JOIN (locales_creature l) ON c.entry = l.entry AND ? } WHERE (spell1=?d OR spell2=?d OR spell3=?d OR spell4=?d) AND factiontemplateID=faction_A ', $npc_cols[0], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'] ); if ($usedbynpc) { $spell['usedbynpc'] = array(); foreach($usedbynpc as $i=>$row) $spell['usedbynpc'][] = creatureinfo2($row); unset ($usedbynpc); } // Используется вещями: $usedbyitem = $DB->select(' SELECT ?#, c.entry { , name_loc?d AS name_loc } FROM ?_icons, item_template c { LEFT JOIN (locales_item l) ON c.entry = l.entry AND ? } WHERE (spellid_1=?d OR (spellid_2=?d AND spelltrigger_2!=6) OR spellid_3=?d OR spellid_4=?d OR spellid_5=?d) AND id=displayID ', $item_cols[2], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'] ); if ($usedbyitem) { $spell['usedbyitem'] = array(); foreach($usedbyitem as $i => $row) $spell['usedbyitem'][] = iteminfo2($row, 0); unset ($usedbyitem); } // Используется наборами вещей: $usedbyitemset = $DB->select(' SELECT * FROM ?_itemset WHERE spell1=?d or spell2=?d or spell3=?d or spell4=?d or spell5=?d or spell6=?d or spell7=?d or spell8=?d ', $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'], $spell['entry'] ); if ($usedbyitemset) { $spell['usedbyitemset'] = array(); foreach($usedbyitemset as $i => $row) $spell['usedbyitemset'][] = itemsetinfo2($row); unset ($usedbyitemset); } // Спелл - награда за квест $questreward = $DB->select(' SELECT c.?# { , Title_loc?d AS Title_loc } FROM quest_template c { LEFT JOIN (locales_quest l) ON c.entry = l.entry AND ? } WHERE RewSpell=?d OR RewSpellCast=?d ', $quest_cols[2], ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP, ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP, $spell['entry'], $spell['entry'] ); if ($questreward) { $spell['questreward'] = array(); foreach($questreward as $i => $row) $spell['questreward'][] = GetQuestInfo($row, 0xFFFFFF); unset ($questreward); } // Проверяем на пустые массивы if (!($spell['taughtbyitem'])) unset ($spell['taughtbyitem']); if (!($spell['taughtbynpc'])) unset ($spell['taughtbynpc']); $smarty->assign('spell', $spell); save_cache(13, $spell['spellID'], $spell); } } global $page; $page = array( 'Mapper' => false, 'Book' => false, 'Title' => $spell['name'].' - '.$smarty->get_config_vars('Spells'), 'tab' => 0, 'type' => 6, 'typeid' => $spell['entry'], 'path' => '[0,1]' ); $smarty->assign('page', $page); // Комментарии $smarty->assign('comments', getcomments($page['type'], $page['typeid'])); // Количество MySQL запросов $smarty->assign('mysql', $DB->getStatistics()); if (count($allspells)>=0) $smarty->assign('allspells',$allspells); if (count($allitems)>=0) $smarty->assign('allitems',$allitems); $smarty->display('spell.tpl'); ?>