| 1 | <?php
|
|---|
| 2 |
|
|---|
| 3 | require_once 'includes/game.php';
|
|---|
| 4 | require_once 'includes/allspells.php';
|
|---|
| 5 | require_once 'includes/allitemsets.php';
|
|---|
| 6 | require_once 'includes/allobjects.php';
|
|---|
| 7 | require_once 'includes/allquests.php';
|
|---|
| 8 |
|
|---|
| 9 | // Массивы с названиями столбцов, необходимых для различных уровней вызова функций
|
|---|
| 10 | // для allitems($level=0) - соответствия номер-иконка
|
|---|
| 11 | $item_cols[0] = array('entry', 'iconname', 'quality', 'name');
|
|---|
| 12 | // для allitems($level=1) - ajax, тултип
|
|---|
| 13 | $item_cols[1] = array('entry', 'name', 'quality', 'iconname', 'maxcount', 'bonding', 'startquest', 'Map', 'ContainerSlots', 'class', 'InventoryType', 'subclass', 'dmg_type1','dmg_min1', 'dmg_max1', 'delay', 'dmg_type2', 'dmg_min2', 'dmg_max2', 'dmg_type3', 'dmg_min3', 'dmg_max3', 'dmg_type4', 'dmg_min4', 'dmg_max4', 'dmg_type5', 'dmg_min5', 'dmg_max5', 'armor', 'block', 'GemProperties', 'stat_type1', 'stat_type2', 'stat_type3', 'stat_type4', 'stat_type5', 'stat_type6', 'stat_type7', 'stat_type8', 'stat_type9', 'stat_type10', 'stat_value1', 'stat_value2', 'stat_value3', 'stat_value4', 'stat_value5', 'stat_value6', 'stat_value7', 'stat_value8', 'stat_value9', 'stat_value10', 'holy_res', 'fire_res', 'nature_res', 'frost_res', 'shadow_res', 'arcane_res', 'RandomProperty', 'RandomSuffix', 'socketColor_1', 'socketColor_2', 'socketColor_3', 'socketBonus', 'MaxDurability', 'AllowableClass', 'RequiredLevel', 'RequiredSkill', 'requiredspell', 'RequiredReputationFaction', 'RequiredReputationRank', 'spellid_1', 'spellid_2', 'spellid_3','spellid_4','spellid_5', 'spelltrigger_1', 'spelltrigger_2', 'spelltrigger_3', 'spelltrigger_4', 'spelltrigger_5', 'description', 'PageText', 'BagFamily', 'RequiredSkillRank');
|
|---|
| 14 | // для iteminfo($level=0) - строчки списка
|
|---|
| 15 | $item_cols[2] = array('name', 'quality', 'iconname', 'InventoryType', 'ItemLevel', 'RequiredLevel', 'class', 'subclass', 'stackable', 'BuyPrice', 'armor', 'dmg_type1','dmg_min1', 'dmg_max1', 'delay', 'dmg_type2', 'dmg_min2', 'dmg_max2', 'dmg_type3', 'dmg_min3', 'dmg_max3', 'dmg_type4', 'dmg_min4', 'dmg_max4', 'dmg_type5', 'dmg_min5', 'dmg_max5', 'ContainerSlots');
|
|---|
| 16 | // для iteminfo($level=1)
|
|---|
| 17 | $item_cols[3] = array('entry', 'name', 'quality', 'iconname', 'maxcount', 'bonding', 'startquest', 'Map', 'ContainerSlots', 'class', 'InventoryType', 'subclass', 'dmg_type1','dmg_min1', 'dmg_max1', 'delay', 'dmg_type2', 'dmg_min2', 'dmg_max2', 'dmg_type3', 'dmg_min3', 'dmg_max3', 'dmg_type4', 'dmg_min4', 'dmg_max4', 'dmg_type5', 'dmg_min5', 'dmg_max5', 'armor', 'block', 'GemProperties', 'stat_type1', 'stat_type2', 'stat_type3', 'stat_type4', 'stat_type5', 'stat_type6', 'stat_type7', 'stat_type8', 'stat_type9', 'stat_type10', 'stat_value1', 'stat_value2', 'stat_value3', 'stat_value4', 'stat_value5', 'stat_value6', 'stat_value7', 'stat_value8', 'stat_value9', 'stat_value10', 'holy_res', 'fire_res', 'nature_res', 'frost_res', 'shadow_res', 'arcane_res', 'RandomProperty', 'RandomSuffix', 'socketColor_1', 'socketColor_2', 'socketColor_3', 'socketBonus', 'MaxDurability', 'AllowableClass', 'RequiredLevel', 'RequiredSkill', 'requiredspell', 'RequiredReputationFaction', 'RequiredReputationRank', 'spellid_1', 'spellid_2', 'spellid_3','spellid_4','spellid_5', 'spelltrigger_1', 'spelltrigger_2', 'spelltrigger_3', 'spelltrigger_4', 'spelltrigger_5', 'description', 'PageText', 'BagFamily', 'RequiredSkillRank', 'ItemLevel', 'stackable', 'BuyPrice', 'DisenchantID', 'SellPrice', 'RequiredDisenchantSkill');
|
|---|
| 18 |
|
|---|
| 19 | $resz = array('holy_res', 'fire_res', 'nature_res', 'frost_res', 'shadow_res', 'arcane_res');
|
|---|
| 20 | $resz_desc = array (LOCALE_HOLY_RESISTANCE, LOCALE_FIRE_RESISTANCE, LOCALE_NATURE_RESISTANCE, LOCALE_FROST_RESISTANCE, LOCALE_SHADOW_RESISTANCE, LOCALE_ARCANE_RESISTANCE);
|
|---|
| 21 | $bag_typez = array(0=>LOCALE_BAG,1=>LOCALE_BAG_QUIVER,2=>LOCALE_BAG_AMMO,4=>LOCALE_BAG_SOUL,8=>LOCALE_BAG_LEATHER,32=>LOCALE_BAG_HERB,64=>LOCALE_BAG_ENCHANT,128=>LOCALE_BAG_ENGINEER,512=>LOCALE_BAG_GEM,1024=>LOCALE_BAG_MINING);
|
|---|
| 22 | $rep_levels = array('','','', LOCALE_NEUTRAL, LOCALE_FRIENDLY, LOCALE_HONORED, LOCALE_REVERED, LOCALE_EXALTED);
|
|---|
| 23 | $bond = array('', '<br />'.LOCALE_BIND_PICKUP, '<br />'.LOCALE_BIND_EQUIP, '<br />'.LOCALE_BIND_SOULBOUND, '<br />'.LOCALE_BIND_QUEST_ITEM);
|
|---|
| 24 | $slot = array('',LOCALE_EQUIP_HEAD,LOCALE_EQUIP_NECK,LOCALE_EQUIP_SHOULDER,LOCALE_EQUIP_SHIRT,LOCALE_EQUIP_CHEST,LOCALE_EQUIP_WAIST,LOCALE_EQUIP_LEGS,LOCALE_EQUIP_FEET,LOCALE_EQUIP_WRIST,LOCALE_EQUIP_HANDS,LOCALE_EQUIP_FINGER,LOCALE_EQUIP_TRINKET,LOCALE_EQUIP_ONEHAND,LOCALE_EQUIP_OFFHAND,LOCALE_EQUIP_RANGED,LOCALE_EQUIP_BACK,LOCALE_EQUIP_TWOHAND,LOCALE_EQUIP_UNK0,LOCALE_EQUIP_TABARD,LOCALE_EQUIP_CHEST2,LOCALE_EQUIP_MAINHAND,LOCALE_EQUIP_OFFHAND2,LOCALE_EQUIP_HELDINOFFHAND,LOCALE_EQUIP_PROJECTILE,LOCALE_EQUIP_THROWN,LOCALE_EQUIP_RANGED2,LOCALE_EQUIP_UNK1,LOCALE_EQUIP_RELIC);
|
|---|
| 25 | $armor_type = array('',LOCALE_ARMOR_CLOTH,LOCALE_ARMOR_LEATHER,LOCALE_ARMOR_MAIL,LOCALE_ARMOR_PLATE,LOCALE_ARMOR_BUCKLER,LOCALE_ARMOR_SHIELD,LOCALE_ARMOR_LIBRAM,LOCALE_ARMOR_IDOL,LOCALE_ARMOR_TOTEM);
|
|---|
| 26 | $weapon_type = array(LOCALE_WEAPON_AXE1H,LOCALE_WEAPON_AXE2H,LOCALE_WEAPON_BOW,LOCALE_WEAPON_GUN,LOCALE_WEAPON_MACE1H,LOCALE_WEAPON_MACE2H,LOCALE_WEAPON_POLEARM,LOCALE_WEAPON_SWORD1H,LOCALE_WEAPON_SWORD2H,LOCALE_WEAPON_OBSOLETE,LOCALE_WEAPON_STAFF,LOCALE_WEAPON_EXOTIC,LOCALE_WEAPON_EXOTIC2,LOCALE_WEAPON_FIST,LOCALE_WEAPON_MISC,LOCALE_WEAPON_DAGGER,LOCALE_WEAPON_THROWN,LOCALE_WEAPON_SPEAR,LOCALE_WEAPON_CROSSBOW,LOCALE_WEAPON_WAND,LOCALE_WEAPON_FISHINGPOLE);
|
|---|
| 27 | $projectile_type = array(LOCALE_PROJECTILE_WAND,LOCALE_PROJECTILE_BOLT,LOCALE_PROJECTILE_ARROW,LOCALE_PROJECTILE_BULLET,LOCALE_PROJECTILE_THROWN);
|
|---|
| 28 | $dmg_typez = array ('',LOCALE_DAMAGE_HOLY,LOCALE_DAMAGE_FIRE,LOCALE_DAMAGE_NATURE,LOCALE_DAMAGE_FROST,LOCALE_DAMAGE_SHADOW,LOCALE_DAMAGE_ARCANE);
|
|---|
| 29 |
|
|---|
| 30 | // Таблица урона
|
|---|
| 31 | function inv_dmg($min,$max,$delay,$type)
|
|---|
| 32 | {
|
|---|
| 33 | global $dmg_typez;
|
|---|
| 34 | if ($delay!=0)
|
|---|
| 35 | return '<table width="100%"><tr><td>'.$min.' - '.$max.LOCALE_DAMAGE_PRE.$dmg_typez[$type].LOCALE_DAMAGE_POST.'</td><th>'.LOCALE_SPEED.' '.number_format($delay,2).'</th></tr></table>';
|
|---|
| 36 | else
|
|---|
| 37 | return '+'.$min.' - '.$max.LOCALE_DAMAGE_PRE.$dmg_typez[$type].LOCALE_DAMAGE_POST.'<br />';
|
|---|
| 38 | }
|
|---|
| 39 |
|
|---|
| 40 | function green_bonus($str, $val)
|
|---|
| 41 | {
|
|---|
| 42 | //TODO
|
|---|
| 43 | return str_replace('%d', $val, $str);
|
|---|
| 44 | }
|
|---|
| 45 |
|
|---|
| 46 | // Типы бонусов
|
|---|
| 47 | function b_type($type, $value)
|
|---|
| 48 | {
|
|---|
| 49 | global $green;
|
|---|
| 50 | switch($type)
|
|---|
| 51 | {
|
|---|
| 52 | // белые статы
|
|---|
| 53 | case 3: return '+'.$value.LOCALE_STAT_AGILITY.'<br />'; # 3 - Agility
|
|---|
| 54 | case 4: return '+'.$value.LOCALE_STAT_STRENGTH.'<br />'; # 4 - Strength
|
|---|
| 55 | case 5: return '+'.$value.LOCALE_STAT_INTELLECT.'<br />'; # 5 - Intellect
|
|---|
| 56 | case 6: return '+'.$value.LOCALE_STAT_SPIRIT.'<br />'; # 6 - Spirit
|
|---|
| 57 | case 7: return '+'.$value.LOCALE_STAT_STAMINA.'<br />'; # 7 - Stamina
|
|---|
| 58 | // зеленые статы
|
|---|
| 59 | case 12: $green[]=green_bonus(LOCALE_GBONUS_DEFENCE, $value); return;
|
|---|
| 60 | case 13: $green[]=green_bonus(LOCALE_GBONUS_DODGE, $value); return;
|
|---|
| 61 | case 14: $green[]=green_bonus(LOCALE_GBONUS_PARRY, $value); return;
|
|---|
| 62 | case 15: $green[]=green_bonus(LOCALE_GBONUS_SHIELDBLOCK, $value); return;
|
|---|
| 63 |
|
|---|
| 64 | case 18: $green[]=green_bonus(LOCALE_GBONUS_SPELLHIT_RATING, $value); return;
|
|---|
| 65 | case 19: $green[]=green_bonus(LOCALE_GBONUS_MELEECRIT_RATING, $value); return;
|
|---|
| 66 | case 20: $green[]=green_bonus(LOCALE_GBONUS_RANGEDCRIT_RATING, $value); return;
|
|---|
| 67 | case 21: $green[]=green_bonus(LOCALE_GBONUS_SPELLCRIT_RATING, $value); return;
|
|---|
| 68 |
|
|---|
| 69 | case 30: $green[]=green_bonus(LOCALE_GBONUS_SPELLHASTE_RATING, $value); return;
|
|---|
| 70 | case 31: $green[]=green_bonus(LOCALE_GBONUS_HIT_RATING, $value); return;
|
|---|
| 71 | case 32: $green[]=green_bonus(LOCALE_GBONUS_CRIT_RATING, $value); return;
|
|---|
| 72 | case 35: $green[]=green_bonus(LOCALE_GBONUS_RESILIENCE_RATING, $value); return;
|
|---|
| 73 | case 36: $green[]=green_bonus(LOCALE_GBONUS_HASTE_RATING, $value); return;
|
|---|
| 74 | case 37: $green[]=green_bonus(LOCALE_GBONUS_EXPERTISE_RATING, $value); return;
|
|---|
| 75 | default: $green[]=green_bonus(LOCALE_GBONUS_UNKNOWN, $value); return;
|
|---|
| 76 | }
|
|---|
| 77 | }
|
|---|
| 78 |
|
|---|
| 79 | function socket_type($type)
|
|---|
| 80 | {
|
|---|
| 81 | switch($type)
|
|---|
| 82 | {
|
|---|
| 83 | case 1:
|
|---|
| 84 | return '<span class="socket-meta q0">'.LOCALE_SOCKET_META.'</span>';
|
|---|
| 85 | case 2:
|
|---|
| 86 | return '<span class="socket-red q0">'.LOCALE_SOCKET_RED.'</span>';
|
|---|
| 87 | case 4:
|
|---|
| 88 | return '<span class="socket-yellow q0">'.LOCALE_SOCKET_META.'</span>';
|
|---|
| 89 | case 8:
|
|---|
| 90 | return '<span class="socket-blue q0">'.LOCALE_SOCKET_BLUE.'</span>';
|
|---|
| 91 | default:
|
|---|
| 92 | return '<a class="q0">Unknown Socket('.$type.')</a>';
|
|---|
| 93 | }
|
|---|
| 94 | }
|
|---|
| 95 |
|
|---|
| 96 | function socket_bonus($bonus)
|
|---|
| 97 | {
|
|---|
| 98 | global $DB;
|
|---|
| 99 | return $DB->selectCell('SELECT `text` FROM ?_itemenchantmet WHERE itemenchantmetID=?d LIMIT 1',$bonus);
|
|---|
| 100 | }
|
|---|
| 101 |
|
|---|
| 102 | function req_spell($spell_id)
|
|---|
| 103 | {
|
|---|
| 104 | global $DB;
|
|---|
| 105 | return $DB->selectCell('SELECT `spellname` FROM ?_spell WHERE spellID=?d LIMIT 1', $spell_id);
|
|---|
| 106 | }
|
|---|
| 107 |
|
|---|
| 108 | function spell_to_bonus($spell_id, $trigger)
|
|---|
| 109 | {
|
|---|
| 110 | $tooltip = spell_desc($spell_id);
|
|---|
| 111 | if ($tooltip=='_empty_')
|
|---|
| 112 | return;
|
|---|
| 113 | if (!$tooltip)
|
|---|
| 114 | return '<a href="?spell='.$spell_id.'">Error in spell_desc for spell '.$spell_id.'</a>';
|
|---|
| 115 | switch($trigger)
|
|---|
| 116 | {
|
|---|
| 117 | case 0:
|
|---|
| 118 | $t = LOCALE_GBONUS_USE;
|
|---|
| 119 | break;
|
|---|
| 120 | case 1:
|
|---|
| 121 | $t = LOCALE_GBONUS_EQUIP;
|
|---|
| 122 | break;
|
|---|
| 123 | case 2:
|
|---|
| 124 | $t = LOCALE_GBONUS_CHANCEONHIT;
|
|---|
| 125 | break;
|
|---|
| 126 | case 6:
|
|---|
| 127 | // Обучает
|
|---|
| 128 | return;
|
|---|
| 129 | break;
|
|---|
| 130 | default:
|
|---|
| 131 | $t = 'Error! ';
|
|---|
| 132 | break;
|
|---|
| 133 | }
|
|---|
| 134 | return $t.'<a href="?spell='.$spell_id.'" class="q2">'.$tooltip.'</a>';
|
|---|
| 135 | }
|
|---|
| 136 |
|
|---|
| 137 | function allitemsinfo2(&$Row, $level=0)
|
|---|
| 138 | {
|
|---|
| 139 | // Пустая строка
|
|---|
| 140 | if (!isset($Row['entry']))
|
|---|
| 141 | return;
|
|---|
| 142 | // Глобальный массив с информацие о вещях
|
|---|
| 143 | global $allitems;
|
|---|
| 144 | // Номер очередного элемента
|
|---|
| 145 | $num = $Row['entry'];
|
|---|
| 146 | // Если уже есть
|
|---|
| 147 | if (isset($allitems[$num]))
|
|---|
| 148 | return $allitems[$num];
|
|---|
| 149 | // Подключение к базе
|
|---|
| 150 | global $DB;
|
|---|
| 151 | // Записываем id вещи
|
|---|
| 152 | $allitems[$num]['entry'] = $Row['entry'];
|
|---|
| 153 | // Ищем иконку
|
|---|
| 154 | $allitems[$num]['icon'] = $Row['iconname'];
|
|---|
| 155 | // Качество вещи
|
|---|
| 156 | $allitems[$num]['quality'] = $Row['quality'];
|
|---|
| 157 | // Название вещи вместе с локализацией
|
|---|
| 158 | $allitems[$num]['name'] = !empty($Row['name_loc'])?$Row['name_loc']:$Row['name'];
|
|---|
| 159 | // Заполняем инфу о вещи
|
|---|
| 160 | if ($level>0)
|
|---|
| 161 | {
|
|---|
| 162 | $allitems[$num]['info'] = render_item_tooltip($Row);
|
|---|
| 163 | }
|
|---|
| 164 |
|
|---|
| 165 | // if ($level==1)
|
|---|
| 166 | return $allitems[$num];
|
|---|
| 167 | // else
|
|---|
| 168 | // return;
|
|---|
| 169 | }
|
|---|
| 170 |
|
|---|
| 171 | function getitemname($id)
|
|---|
| 172 | {
|
|---|
| 173 | global $DB;
|
|---|
| 174 | $z = $DB->selectRow('
|
|---|
| 175 | SELECT name {, l.name_loc?d as `name_loc`}
|
|---|
| 176 | FROM item_template i
|
|---|
| 177 | { LEFT JOIN (locales_item l) ON l.entry=i.entry AND ? }
|
|---|
| 178 | WHERE
|
|---|
| 179 | i.entry=?
|
|---|
| 180 | LIMIT 1
|
|---|
| 181 | ',
|
|---|
| 182 | ($_SESSION['locale']>0)? $_SESSION['locale']: DBSIMPLE_SKIP,
|
|---|
| 183 | ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
|
|---|
| 184 | $id
|
|---|
| 185 | );
|
|---|
| 186 | return !empty($z['name_loc'])?$z['name_loc']:$z['name'];
|
|---|
| 187 | }
|
|---|
| 188 |
|
|---|
| 189 | function allitemsinfo($id, $level=0)
|
|---|
| 190 | {
|
|---|
| 191 | global $DB;
|
|---|
| 192 | global $allitems;
|
|---|
| 193 | global $item_cols;
|
|---|
| 194 |
|
|---|
| 195 | if (isset($allitems[$id]))
|
|---|
| 196 | {
|
|---|
| 197 | return $allitems[$id];
|
|---|
| 198 | } else {
|
|---|
| 199 | $row = $DB->selectRow('
|
|---|
| 200 | SELECT i.?#
|
|---|
| 201 | {
|
|---|
| 202 | , l.name_loc'.$_SESSION['locale'].' as `name_loc`
|
|---|
| 203 | , l.description_loc'.$_SESSION['locale'].' as `description_loc`
|
|---|
| 204 | , ?
|
|---|
| 205 | }
|
|---|
| 206 | FROM ?_icons, item_template i
|
|---|
| 207 | {
|
|---|
| 208 | LEFT JOIN (locales_item l)
|
|---|
| 209 | ON l.entry=i.entry AND ?
|
|---|
| 210 | }
|
|---|
| 211 | WHERE
|
|---|
| 212 | i.entry=?
|
|---|
| 213 | AND id=displayid
|
|---|
| 214 | LIMIT 1
|
|---|
| 215 | ',
|
|---|
| 216 | $item_cols[$level],
|
|---|
| 217 | ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
|
|---|
| 218 | ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
|
|---|
| 219 | $id
|
|---|
| 220 | );
|
|---|
| 221 | return allitemsinfo2($row, $level);
|
|---|
| 222 | }
|
|---|
| 223 | }
|
|---|
| 224 |
|
|---|
| 225 | function render_item_tooltip(&$Row)
|
|---|
| 226 | {
|
|---|
| 227 | // БД
|
|---|
| 228 | global $DB;
|
|---|
| 229 | // Строковые константы
|
|---|
| 230 | global $resz, $resz_desc, $bag_typez, $bond, $slot, $armor_type, $weapon_type, $projectile_type;
|
|---|
| 231 | // Зеленый текст
|
|---|
| 232 | global $green;
|
|---|
| 233 | // Столбцы для извлечения
|
|---|
| 234 | global $itemset_col;
|
|---|
| 235 |
|
|---|
| 236 | $green = array();
|
|---|
| 237 |
|
|---|
| 238 | $x = '';
|
|---|
| 239 | // Начальный тег таблицы
|
|---|
| 240 | $x .= '<table><tr><td>';
|
|---|
| 241 | // Название и цвет названия
|
|---|
| 242 | $x .= '<b class="q'.$Row['quality'].'">'.(!empty($Row['name_loc'])?$Row['name_loc']:$Row['name']).'</b>';
|
|---|
| 243 | // Биндинг вещи
|
|---|
| 244 | $x .= $bond[$Row['bonding']];
|
|---|
| 245 |
|
|---|
| 246 | // Уникальность вещи
|
|---|
| 247 | if ($Row['maxcount']==1)
|
|---|
| 248 | $x .= '<br />'.LOCALE_UNIQUE;
|
|---|
| 249 |
|
|---|
| 250 | if ($Row['maxcount']>1)
|
|---|
| 251 | $x .= ' ('.$Row['maxcount'].')';
|
|---|
| 252 |
|
|---|
| 253 | if ($Row['startquest'])
|
|---|
| 254 | $x .= '<br /><a class="q1" href="?quest='.$Row['startquest'].'">'.LOCALE_START_QUEST.'</a>';
|
|---|
| 255 |
|
|---|
| 256 | // Локация, для которой предназначен этот предмет
|
|---|
| 257 | if ($Row['Map'])
|
|---|
| 258 | $x .= '<br />'.$DB->selectCell('SELECT `name` FROM ?_zones WHERE mapid=?d LIMIT 1', $Row['Map']);;
|
|---|
| 259 |
|
|---|
| 260 | // Теперь в зависимости от типа предмета
|
|---|
| 261 | if($Row['ContainerSlots']>1)
|
|---|
| 262 | $x .= '<br />'.$Row['ContainerSlots'].LOCALE_SLOT.$bag_typez[$Row['BagFamily']];
|
|---|
| 263 | if(($Row['class']==4) or ($Row['class']==2) or ($Row['class']==6) or ($Row['class']==7))
|
|---|
| 264 | {
|
|---|
| 265 | // Броня (4), Оружие(2), Патроны(6)
|
|---|
| 266 | // Начало таблицы св-в брони
|
|---|
| 267 | $x .= '<table width="100%">';
|
|---|
| 268 | $x .= '<tr>';
|
|---|
| 269 | // Слот
|
|---|
| 270 | $x .= '<td>'.$slot[$Row['InventoryType']].'</td>';
|
|---|
| 271 | // Тип брони
|
|---|
| 272 | if ($Row['class']==4)
|
|---|
| 273 | $x .= '<th>'.$armor_type[$Row['subclass']].'</th>';
|
|---|
| 274 | elseif ($Row['class']==2)
|
|---|
| 275 | $x .= '<th>'.$weapon_type[$Row['subclass']].'</th>';
|
|---|
| 276 | elseif ($Row['class']==6)
|
|---|
| 277 | $x .= '<th>'.$projectile_type[$Row['subclass']].'</th>';
|
|---|
| 278 | $x .= '</tr></table>';
|
|---|
| 279 | } else {
|
|---|
| 280 | $x .= '<br />';
|
|---|
| 281 | }
|
|---|
| 282 |
|
|---|
| 283 | // Урон
|
|---|
| 284 | $dps=0;
|
|---|
| 285 | for ($j=1;$j<=5;$j++)
|
|---|
| 286 | {
|
|---|
| 287 | $d_type = $Row['dmg_type'.$j];
|
|---|
| 288 | $d_min = $Row['dmg_min'.$j];
|
|---|
| 289 | $d_max = $Row['dmg_max'.$j];
|
|---|
| 290 | if (($d_max>0) and ($Row['class']!=6))
|
|---|
| 291 | {
|
|---|
| 292 | $delay = $Row['delay'] / 1000;
|
|---|
| 293 | if ($delay>0) {$dps = $dps+round(($d_max+$d_min)/(2*$delay),1);}
|
|---|
| 294 | if ($j>1) {$delay=0;}
|
|---|
| 295 | $x .= inv_dmg($d_min,$d_max,$delay,$d_type);
|
|---|
| 296 | } elseif (($d_max>0) and ($Row['class']==6))
|
|---|
| 297 | {
|
|---|
| 298 | $x .= LOCALE_DPS_ADDS.' '.number_format((($d_max+$d_min)/2),1).' '.LOCALE_DPS2.'<br />';
|
|---|
| 299 | }
|
|---|
| 300 | }
|
|---|
| 301 | if ($dps>0)
|
|---|
| 302 | $x .= '('.number_format($dps,1).' '.LOCALE_DPS.')<br />';
|
|---|
| 303 | // Кол-во брони
|
|---|
| 304 | if ($Row['armor'])
|
|---|
| 305 | $x .= $Row['armor'].' '.LOCALE_ARMOR.'<br />';
|
|---|
| 306 | if ($Row['block'])
|
|---|
| 307 | $x .= $Row['block'].' '.LOCALE_BLOCK.'<br />';
|
|---|
| 308 | if ($Row['GemProperties'])
|
|---|
| 309 | $x .= $DB->selectCell('SELECT ?_itemenchantmet.text from ?_itemenchantmet, ?_gemproperties WHERE (?_gemproperties.gempropertiesID=?d and ?_itemenchantmet.itemenchantmetID=?_gemproperties.itemenchantmetID)', $Row['GemProperties']).'<br />';
|
|---|
| 310 |
|
|---|
| 311 | // Различные бонусы
|
|---|
| 312 | for ($j=1;$j<=10;$j++)
|
|---|
| 313 | if (($Row['stat_type'.$j]!=0) and ($Row['stat_value'.$j]!=0))
|
|---|
| 314 | $x .= b_type($Row['stat_type'.$j], $Row['stat_value'.$j]);
|
|---|
| 315 |
|
|---|
| 316 | // Бонусы к сопротивлениям магий
|
|---|
| 317 | foreach ($resz as $j => $RowName)
|
|---|
| 318 | {
|
|---|
| 319 | if($Row[$RowName]!=0)
|
|---|
| 320 | {
|
|---|
| 321 | $x .= '+'.$Row[$RowName].' '.$resz_desc[$j].'<br />';
|
|---|
| 322 | }
|
|---|
| 323 | }
|
|---|
| 324 |
|
|---|
| 325 | // Случайные бонусы
|
|---|
| 326 | if ($Row['RandomProperty'] or $Row['RandomSuffix'])
|
|---|
| 327 | $green[] = 'Random Bonuses';
|
|---|
| 328 |
|
|---|
| 329 | // Сокеты
|
|---|
| 330 | for ($j=1;$j<=3;$j++)
|
|---|
| 331 | if ($Row['socketColor_'.$j]!=0)
|
|---|
| 332 | $x .= socket_type($Row['socketColor_'.$j]).'<br />';
|
|---|
| 333 |
|
|---|
| 334 | if ($Row['socketBonus'])
|
|---|
| 335 | $x .= '<span class="q0">Socket Bonus: '.socket_bonus($Row['socketBonus']).'</span><br />';
|
|---|
| 336 | // Состояние
|
|---|
| 337 | if ($Row['MaxDurability'])
|
|---|
| 338 | $x .= LOCALE_DURABILITY.' '.$Row['MaxDurability'].' / '.$Row['MaxDurability'].'<br />';
|
|---|
| 339 | // Требуемые классы
|
|---|
| 340 | if (classes($Row['AllowableClass']))
|
|---|
| 341 | $x .= LOCALE_CLASSES.': '.classes($Row['AllowableClass']).'<br />';
|
|---|
| 342 |
|
|---|
| 343 | // Требуемый уровень
|
|---|
| 344 | if ($Row['RequiredLevel']>1)
|
|---|
| 345 | $x .= LOCALE_REQUIRES_LEVEL.' '.$Row['RequiredLevel'].'<br />';
|
|---|
| 346 |
|
|---|
| 347 | // Требуемый скилл (755 - Jewecrafting)
|
|---|
| 348 | if (($Row['RequiredSkill']) and ($Row['RequiredSkill']!=755))
|
|---|
| 349 | {
|
|---|
| 350 | $x .= LOCALE_REQUIRES.' '.$DB->selectCell('SELECT `name` FROM ?_skill WHERE skillID=?d LIMIT 1',$Row['RequiredSkill']);
|
|---|
| 351 | if ($Row['RequiredSkillRank'])
|
|---|
| 352 | $x .= ' ('.$Row['RequiredSkillRank'].')';
|
|---|
| 353 | $x .= '<br />';
|
|---|
| 354 | }
|
|---|
| 355 |
|
|---|
| 356 | // Требуемый спелл
|
|---|
| 357 | if ($Row['requiredspell'])
|
|---|
| 358 | $x .= LOCALE_REQUIRES.' '.req_spell($Row['requiredspell']).'<br />';
|
|---|
| 359 |
|
|---|
| 360 | // Требуемая репутация
|
|---|
| 361 | if ($Row['RequiredReputationFaction'])
|
|---|
| 362 | {
|
|---|
| 363 | require_once ('includes/game.php');
|
|---|
| 364 | global $rep_levels;
|
|---|
| 365 | $row = factioninfo($Row['RequiredReputationFaction']);
|
|---|
| 366 | $x .= LOCALE_REQUIRES.' '.$row['name'].' - '.$rep_levels[$Row['RequiredReputationRank']];
|
|---|
| 367 | }
|
|---|
| 368 |
|
|---|
| 369 | $x .= '</td></tr></table>';
|
|---|
| 370 |
|
|---|
| 371 | // Спеллы
|
|---|
| 372 | for ($j=1;$j<=5;$j++)
|
|---|
| 373 | {
|
|---|
| 374 | if ($Row['spellid_'.$j])
|
|---|
| 375 | $green[]=spell_to_bonus($Row['spellid_'.$j], $Row['spelltrigger_'.$j]);
|
|---|
| 376 | }
|
|---|
| 377 |
|
|---|
| 378 | // Перебираем все "зеленые" бонусы
|
|---|
| 379 | $x .= '<table><tr><td>';
|
|---|
| 380 | if ($green)
|
|---|
| 381 | {
|
|---|
| 382 | foreach ($green as $j => $bonus)
|
|---|
| 383 | if ($bonus)
|
|---|
| 384 | $x .= '<span class="q2">'.$bonus.'</span><br />';
|
|---|
| 385 | }
|
|---|
| 386 |
|
|---|
| 387 | if ($Row['description'])
|
|---|
| 388 | {
|
|---|
| 389 | if ($Row['spelltrigger_2']==6)
|
|---|
| 390 | $x .= '<span class="q2">'.LOCALE_GBONUS_USE.' <a href="?spell='.$Row['spellid_2'].'">'.(!empty($Row['description_loc'])?$Row['description_loc']:$Row['description']).'</a></span>';
|
|---|
| 391 | else
|
|---|
| 392 | $x .= '<span class="q">"'.(!empty($Row['description_loc'])?$Row['description_loc']:$Row['description']).'"</span>';
|
|---|
| 393 | }
|
|---|
| 394 | if ($Row['PageText'])
|
|---|
| 395 | $x .= '<br /><span class="q2"><Right Click To Read></span>'; // TODO: locale
|
|---|
| 396 |
|
|---|
| 397 | // Item Set
|
|---|
| 398 | // Временное хранилище всех вещей;
|
|---|
| 399 | $x_tmp = '';
|
|---|
| 400 | $row = $DB->selectRow('SELECT ?# FROM ?_itemset WHERE (item1=?d or item2=?d or item3=?d or item4=?d or item5=?d or item6=?d or item7=?d or item8=?d or item9=?d or item10=?d) LIMIT 1', $itemset_col[1], $Row['entry'], $Row['entry'], $Row['entry'], $Row['entry'], $Row['entry'], $Row['entry'], $Row['entry'], $Row['entry'], $Row['entry'], $Row['entry']);
|
|---|
| 401 | if ($row)
|
|---|
| 402 | {
|
|---|
| 403 | $num = 0; // Кол-во вещей в наборе
|
|---|
| 404 | for ($i=1;$i<=10;$i++)
|
|---|
| 405 | {
|
|---|
| 406 | if ($row['item'.$i] >0)
|
|---|
| 407 | {
|
|---|
| 408 | $num++;
|
|---|
| 409 | $name = getitemname($row['item'.$i]);
|
|---|
| 410 | $x_tmp .= '<span><a href="?item='.$row['item'.$i].'">'.$name.'</a></span><br />';
|
|---|
| 411 | }
|
|---|
| 412 | }
|
|---|
| 413 | $x .= '<span class="q"><a href="?itemset='.$row['itemsetID'].'" class="q">'.$row['name'].'</a> (0/'.$num.')</span>';
|
|---|
| 414 | // Если требуется скилл
|
|---|
| 415 | if ($row['skillID'])
|
|---|
| 416 | {
|
|---|
| 417 | $name = $DB->selectCell('SELECT `name` FROM ?_skill WHERE skillID=?d LIMIT 1', $row['skillID']);
|
|---|
| 418 | $x .= LOCALE_REQUIRES.' <a href="?spells=11.'.$row['skillID'].'" class="q1">'.$name.'</a>';
|
|---|
| 419 | if ($row['skilllevel'])
|
|---|
| 420 | $x .= ' ('.$row['skilllevel'].')';
|
|---|
| 421 | $x .= '<br />';
|
|---|
| 422 | }
|
|---|
| 423 | // Перечисление всех составляющих набора
|
|---|
| 424 | $x .= '<div class="q0 indent">'.$x_tmp.'</div>';
|
|---|
| 425 | // Перечисление всех бонусов набора
|
|---|
| 426 | $x .= '<span class="q0">';
|
|---|
| 427 | $num = 0;
|
|---|
| 428 | for ($j=1;$j<=8;$j++)
|
|---|
| 429 | if ($row['spell'.$j])
|
|---|
| 430 | {
|
|---|
| 431 | $itemset['spells'][$num]['entry'] = $row['spell'.$j];
|
|---|
| 432 | $itemset['spells'][$num]['tooltip'] = spell_desc($row['spell'.$j]);
|
|---|
| 433 | $itemset['spells'][$num]['bonus'] = $row['bonus'.$j];
|
|---|
| 434 | $num++;
|
|---|
| 435 | }
|
|---|
| 436 | // Сортировка бонусов
|
|---|
| 437 | $x .= '<span class="q0">';
|
|---|
| 438 | for ($i=0;$i<$num;$i++)
|
|---|
| 439 | {
|
|---|
| 440 | for ($j=$i;$j<=$num-1;$j++)
|
|---|
| 441 | if ($itemset['spells'][$j]['bonus'] < $itemset['spells'][$i]['bonus'])
|
|---|
| 442 | {
|
|---|
| 443 | UnSet($tmp);
|
|---|
| 444 | $tmp = $itemset['spells'][$i];
|
|---|
| 445 | $itemset['spells'][$i] = $itemset['spells'][$j];
|
|---|
| 446 | $itemset['spells'][$j] = $tmp;
|
|---|
| 447 | }
|
|---|
| 448 | $x .= '<span>('.$itemset['spells'][$i]['bonus'].') Set: <a href="?spell='.$itemset['spells'][$i]['entry'].'">'.$itemset['spells'][$i]['tooltip'].'</a></span><br />';
|
|---|
| 449 | }
|
|---|
| 450 | $x .= '</span></span>';
|
|---|
| 451 | }
|
|---|
| 452 | $x .= '</td></tr></table>';
|
|---|
| 453 | return $x;
|
|---|
| 454 | }
|
|---|
| 455 |
|
|---|
| 456 | // Функция информации о вещи
|
|---|
| 457 | function iteminfo2(&$Row, $level=0)
|
|---|
| 458 | {
|
|---|
| 459 | global $DB;
|
|---|
| 460 | global $allitems;
|
|---|
| 461 | global $spell_cols;
|
|---|
| 462 | global $object_cols;
|
|---|
| 463 |
|
|---|
| 464 | if (!isset($Row['entry']))
|
|---|
| 465 | return;
|
|---|
| 466 |
|
|---|
| 467 | $item = array();
|
|---|
| 468 | // Номер вещи
|
|---|
| 469 | $item['entry'] = $Row['entry'];
|
|---|
| 470 | // Название вещи
|
|---|
| 471 | $item['name'] = !empty($Row['name_loc'])?$Row['name_loc']:$Row['name'];
|
|---|
| 472 | // Тип вещи
|
|---|
| 473 | $item['type'] = $Row['InventoryType'];
|
|---|
| 474 | $item['icon'] = $Row['iconname'];
|
|---|
| 475 | // Уровень вещи
|
|---|
| 476 | $item['level'] = $Row['ItemLevel'];
|
|---|
| 477 | // Качество вещи...
|
|---|
| 478 | $item['quality'] = $Row['quality'];
|
|---|
| 479 | $item['quality2'] = 6 - $Row['quality'];
|
|---|
| 480 | // Требуемый уровень вещи:
|
|---|
| 481 | $item['reqlevel'] = $Row['RequiredLevel'];
|
|---|
| 482 | // Класс и подкласс вещи
|
|---|
| 483 | // TODO: немного неверное определение
|
|---|
| 484 | $item['classs'] = $Row['class'];
|
|---|
| 485 | $item['subclass'] = $Row['subclass'];
|
|---|
| 486 | // Иконка вещи
|
|---|
| 487 | $item['iconname'] = $Row['iconname'];
|
|---|
| 488 | // Кол-во вещей в пачке
|
|---|
| 489 | $item['stackable'] = $Row['stackable'];
|
|---|
| 490 | // Стоимость вещи для покупки
|
|---|
| 491 | // DPS
|
|---|
| 492 | $dps = 0;
|
|---|
| 493 | if ($Row['class']==2)
|
|---|
| 494 | {
|
|---|
| 495 | for ($i=1;$i<=5;$i++)
|
|---|
| 496 | {
|
|---|
| 497 | $d_type = $Row['dmg_type'.$i];
|
|---|
| 498 | $d_min = $Row['dmg_min'.$i];
|
|---|
| 499 | $d_max = $Row['dmg_max'.$i];
|
|---|
| 500 | if (($d_max>0) and ($Row['class']!=6))
|
|---|
| 501 | {
|
|---|
| 502 | $delay = $Row['delay'] / 1000;
|
|---|
| 503 | if ($delay>0) {$dps = $dps+round(($d_max+$d_min)/(2*$delay),1);}
|
|---|
| 504 | }
|
|---|
| 505 | }
|
|---|
| 506 | $item['dps'] = $dps;
|
|---|
| 507 | $item['speed'] = $Row['delay']/1000;
|
|---|
| 508 | if (!$item['speed']) $item['speed'] = -1;
|
|---|
| 509 | }
|
|---|
| 510 | // Armor
|
|---|
| 511 | $item['armor'] = $Row['armor'];
|
|---|
| 512 | $item['slot'] = $Row['InventoryType'];
|
|---|
| 513 | // Bag
|
|---|
| 514 | if ($Row['class']==1)
|
|---|
| 515 | $item['slots'] = $Row['ContainerSlots'];
|
|---|
| 516 | // Добавляем в глобальный массив allitems
|
|---|
| 517 | allitemsinfo2($Row, 0);
|
|---|
| 518 | if ($level>0)
|
|---|
| 519 | {
|
|---|
| 520 | $item['BuyPrice'] = $Row['BuyPrice'];
|
|---|
| 521 | //
|
|---|
| 522 | $item['BagFamily'] = $Row['BagFamily'];
|
|---|
| 523 | $item['ContainerSlots'] = $Row['ContainerSlots'];
|
|---|
| 524 | $item['DisenchantID'] = $Row['DisenchantID'];
|
|---|
| 525 | // Навык энчанта для разборки вещи
|
|---|
| 526 | if ($Row['RequiredDisenchantSkill']!=-1)
|
|---|
| 527 | $item['disenchantskill'] = $Row['RequiredDisenchantSkill'];
|
|---|
| 528 | // Цена на продажу
|
|---|
| 529 | $item['sellgold'] = floor($Row['SellPrice']/10000);
|
|---|
| 530 | $item['sellsilver'] = floor($Row['SellPrice']%10000/100);
|
|---|
| 531 | $item['sellcopper'] = floor($Row['SellPrice']%100);
|
|---|
| 532 | // Цена за покупку
|
|---|
| 533 | $item['buygold'] = floor($Row['BuyPrice']/10000);
|
|---|
| 534 | $item['buysilver'] = floor($Row['BuyPrice']%10000/100);
|
|---|
| 535 | $item['buycopper'] = floor($Row['BuyPrice']%100);
|
|---|
| 536 | // Начинает квест
|
|---|
| 537 | if($Row['startquest'])
|
|---|
| 538 | $item['starts'] = array(GetDBQuestInfo($Row['startquest'], 0xFFFFFF));
|
|---|
| 539 | // Информационное окно
|
|---|
| 540 | $item['info'] = render_item_tooltip($Row);
|
|---|
| 541 | // Обучает
|
|---|
| 542 | $teaches = array();
|
|---|
| 543 | for ($j=1;$j<=4;$j++)
|
|---|
| 544 | if ($Row['spellid_'.$j]==483)
|
|---|
| 545 | $teaches[] = spellinfo($Row['spellid_'.($j+1)]);
|
|---|
| 546 | if ($teaches)
|
|---|
| 547 | {
|
|---|
| 548 | $item['teaches'] = $teaches;
|
|---|
| 549 | unset ($teaches);
|
|---|
| 550 | unset ($spellrow);
|
|---|
| 551 | }
|
|---|
| 552 | // Открывает:
|
|---|
| 553 | // Тип замков, для которых этот предмет является ключем:
|
|---|
| 554 | $locks_row = $DB->selectCol('
|
|---|
| 555 | SELECT lockID
|
|---|
| 556 | FROM ?_lock
|
|---|
| 557 | WHERE
|
|---|
| 558 | (type1=1 AND lockproperties1=?d) OR
|
|---|
| 559 | (type2=1 AND lockproperties2=?d) OR
|
|---|
| 560 | (type3=1 AND lockproperties3=?d) OR
|
|---|
| 561 | (type4=1 AND lockproperties4=?d) OR
|
|---|
| 562 | (type5=1 AND lockproperties5=?d)
|
|---|
| 563 | ',
|
|---|
| 564 | $item['entry'], $item['entry'], $item['entry'], $item['entry'], $item['entry']
|
|---|
| 565 | );
|
|---|
| 566 | if ($locks_row)
|
|---|
| 567 | {
|
|---|
| 568 | // Игровые объекты с таким типом замка:
|
|---|
| 569 | $item['unlocks'] = $DB->select('
|
|---|
| 570 | SELECT ?#
|
|---|
| 571 | FROM gameobject_template
|
|---|
| 572 | WHERE
|
|---|
| 573 | (
|
|---|
| 574 | ((type IN (?a)) AND (data0 IN (?a)))
|
|---|
| 575 | OR
|
|---|
| 576 | ((type IN (?a)) AND (data0 IN (?a)))
|
|---|
| 577 | )
|
|---|
| 578 | ',
|
|---|
| 579 | $object_cols[0],
|
|---|
| 580 | array(GAMEOBJECT_TYPE_QUESTGIVER, GAMEOBJECT_TYPE_CHEST, GAMEOBJECT_TYPE_TRAP, GAMEOBJECT_TYPE_GOOBER, GAMEOBJECT_TYPE_CAMERA, GAMEOBJECT_TYPE_FLAGSTAND, GAMEOBJECT_TYPE_FLAGDROP),
|
|---|
| 581 | $locks_row,
|
|---|
| 582 | array(GAMEOBJECT_TYPE_DOOR, GAMEOBJECT_TYPE_BUTTON),
|
|---|
| 583 | $locks_row
|
|---|
| 584 | );
|
|---|
| 585 | if (!($item['unlocks']))
|
|---|
| 586 | unset ($item['unlocks']);
|
|---|
| 587 | }
|
|---|
| 588 | unset ($locks_row);
|
|---|
| 589 | }
|
|---|
| 590 | return $item;
|
|---|
| 591 | }
|
|---|
| 592 |
|
|---|
| 593 | // Функция информации о вещи
|
|---|
| 594 | function iteminfo($id, $level=0)
|
|---|
| 595 | {
|
|---|
| 596 | global $item_cols;
|
|---|
| 597 | global $DB;
|
|---|
| 598 | $row = $DB->selectRow('
|
|---|
| 599 | SELECT i.?#, i.entry, maxcount
|
|---|
| 600 | {
|
|---|
| 601 | , l.name_loc'.$_SESSION['locale'].' as `name_loc`
|
|---|
| 602 | , l.description_loc'.$_SESSION['locale'].' as `description_loc`
|
|---|
| 603 | , ?
|
|---|
| 604 | }
|
|---|
| 605 | FROM ?_icons, item_template i
|
|---|
| 606 | { LEFT JOIN (locales_item l) ON l.entry=i.entry AND ? }
|
|---|
| 607 | WHERE
|
|---|
| 608 | (i.entry=?d and id=displayid)
|
|---|
| 609 | LIMIT 1
|
|---|
| 610 | ',
|
|---|
| 611 | $item_cols[2+$level],
|
|---|
| 612 | ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
|
|---|
| 613 | ($_SESSION['locale']>0)? 1: DBSIMPLE_SKIP,
|
|---|
| 614 | $id
|
|---|
| 615 | );
|
|---|
| 616 | return iteminfo2($row, $level);
|
|---|
| 617 | }
|
|---|
| 618 |
|
|---|
| 619 | ?>
|
|---|