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 | ?>
|
---|