source: aowow/includes/allitems.php

Last change on this file was 170, checked in by maron, 15 years ago
  • Property svn:executable set to *
File size: 23.8 KB
Line 
1<?php
2
3require_once 'includes/game.php';
4require_once 'includes/allspells.php';
5require_once 'includes/allitemsets.php';
6require_once 'includes/allobjects.php';
7require_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// Таблица урона
31function 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
40function green_bonus($str, $val)
41{
42 //TODO
43 return str_replace('%d', $val, $str);
44}
45
46// Типы бонусов
47function 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
79function 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
96function socket_bonus($bonus)
97{
98 global $DB;
99 return $DB->selectCell('SELECT `text` FROM ?_itemenchantmet WHERE itemenchantmetID=?d LIMIT 1',$bonus);
100}
101
102function 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
108function 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
137function 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
171function 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
189function 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
225function 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">&lt;Right Click To Read&gt;</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// Функция информации о вещи
457function 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// Функция информации о вещи
594function 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?>
Note: See TracBrowser for help on using the repository browser.