Формат информации о пуле.
[cswow.git] / include / item_table.php
blobca7df5ee1f86188166a9be535349beae16f255ac
1 <?php
2 include_once("spell_data.php");
3 include_once("player_data.php");
5 define('TYPE_ITEM', 3);
6 define('TYPE_CONTAINER', 7);
8 define('ITEM_FIELD_GUID', 0x0000);
9 define('ITEM_FIELD_TYPE', 0x0002);
10 define('ITEM_FIELD_ENTRY', 0x0003);
11 define('ITEM_FIELD_SCALE_X', 0x0004);
12 define('ITEM_FIELD_PADDING', 0x0005);
13 define('ITEM_FIELD_OWNER', 0x0006); // 2 4 1
14 define('ITEM_FIELD_CONTAINED', 0x0008); // 2 4 1
15 define('ITEM_FIELD_CREATOR', 0x000A); // 2 4 1
16 define('ITEM_FIELD_GIFTCREATOR', 0x000C); // 2 4 1
17 define('ITEM_FIELD_STACK_COUNT', 0x000E); // 1 1 20
18 define('ITEM_FIELD_DURATION', 0x000F); // 1 1 20
19 define('ITEM_FIELD_SPELL_CHARGES', 0x0010); // 5 1 20
20 define('ITEM_FIELD_FLAGS', 0x0015); // 1 1 1
21 define('ITEM_FIELD_ENCHANTMENT', 0x0016); // 33 1 1
22 define('PERM_ENCHANTMENT_SLOT', ITEM_FIELD_ENCHANTMENT);
23 define('TEMP_ENCHANTMENT_SLOT', ITEM_FIELD_ENCHANTMENT+3);
24 define('SOCK_ENCHANTMENT_SLOT', ITEM_FIELD_ENCHANTMENT+6);
25 define('SOCK_ENCHANTMENT_SLOT_2', ITEM_FIELD_ENCHANTMENT+9);
26 define('SOCK_ENCHANTMENT_SLOT_3', ITEM_FIELD_ENCHANTMENT+12);
27 define('BONUS_ENCHANTMENT_SLOT', ITEM_FIELD_ENCHANTMENT+15);
28 define('WOTLK_ENCHANTMENT_SLOT', ITEM_FIELD_ENCHANTMENT+18);
29 define('PROP_ENCHANTMENT_SLOT_0', ITEM_FIELD_ENCHANTMENT+21); // used with RandomSuffix
30 define('PROP_ENCHANTMENT_SLOT_1', ITEM_FIELD_ENCHANTMENT+24); // used with RandomSuffix
31 define('PROP_ENCHANTMENT_SLOT_2', ITEM_FIELD_ENCHANTMENT+27); // used with RandomSuffix and RandomProperty
32 define('PROP_ENCHANTMENT_SLOT_3', ITEM_FIELD_ENCHANTMENT+30); // used with RandomProperty
33 define('PROP_ENCHANTMENT_SLOT_4', ITEM_FIELD_ENCHANTMENT+33); // used with RandomProperty
34 define('ITEM_FIELD_PROPERTY_SEED', 0x003A); // 1 1 1
35 define('ITEM_FIELD_SUFFIX_FACTOR', ITEM_FIELD_PROPERTY_SEED);
36 define('ITEM_FIELD_RANDOM_PROPERTIES_ID', 0x003B); // 1 1 1
37 define('ITEM_FIELD_ITEM_TEXT_ID', 0x003C); // 1 1 4
38 define('ITEM_FIELD_DURABILITY', 0x003D); // 1 1 20
39 define('ITEM_FIELD_MAXDURABILITY', 0x003E); // 1 1 20
40 define('ITEM_FIELD_PAD', 0x003F);
41 define('ITEM_END', 0x0040);
43 define('CONTAINER_FIELD_NUM_SLOTS', ITEM_END + 0x0000); // Size: 1, Type: INT, Flags: PUBLIC
44 define('CONTAINER_ALIGN_PAD', ITEM_END + 0x0001); // Size: 1, Type: BYTES, Flags: NONE
45 define('CONTAINER_FIELD_SLOT_1', ITEM_END + 0x0002); // Size: 72, Type: LONG, Flags: PUBLIC
46 define('CONTAINER_END', ITEM_END + 0x004A);
48 // Флаги поля ITEM_FIELD_FLAGS
49 define('ITEM_FLAGS_BINDED', 0x00000001);
50 define('ITEM_FLAGS_CONJURED', 0x00000002);
51 define('ITEM_FLAGS_OPENABLE', 0x00000004);
52 define('ITEM_FLAGS_HEROIC', 0x00000008);
53 define('ITEM_FLAGS_WRAPPER', 0x00000200); // used or not used wrapper
54 define('ITEM_FLAGS_PARTY_LOOT', 0x00000800); // determines if item is party loot or not
55 define('ITEM_FLAGS_CHARTER', 0x00002000); // arena/guild charter
56 define('ITEM_FLAGS_PROSPECTABLE', 0x00040000);
57 define('ITEM_FLAGS_UNIQUE_EQUIPPED', 0x00080000);
58 define('ITEM_FLAGS_USEABLE_IN_ARENA',0x00200000);
59 define('ITEM_FLAGS_THROWABLE', 0x00400000); // not used in game for check trow possibility, only for item in game tooltip
60 define('ITEM_FLAGS_SPECIALUSE', 0x00800000); //
61 define('ITEM_FLAGS_BOA', 0x08000000); // bind on account
62 define('ITEM_FLAGS_ENCHANTER_SCROLL',0x10000000);
63 define('ITEM_FLAGS_MILLABLE', 0x20000000);
64 define('ITEM_FLAGS_BOP_TRADEABLE', 0x80000000);
66 // Флаги поля ITEM_FIELD_FLAGS2
67 define('ITEM_FLAGS2_HORDE_ONLY', 0x00000001);
68 define('ITEM_FLAGS2_ALLIANCE_ONLY', 0x00000002);
69 define('ITEM_FLAGS2_EXT_COST_REQUIRES_GOLD', 0x00000004);
70 define('ITEM_FLAGS2_NEED_ROLL_DISABLED', 0x00000100);
72 // Флаги BAG_FAMILY_MASK
73 define('BAG_FAMILY_MASK_ARROWS', 0x00000001);
74 define('BAG_FAMILY_MASK_BULLETS', 0x00000002);
75 define('BAG_FAMILY_MASK_SHARDS', 0x00000004);
76 define('BAG_FAMILY_MASK_LEATHERWORKING_SUPP', 0x00000008);
77 define('BAG_FAMILY_MASK_INSCRIPTION_SUPP', 0x00000010);
78 define('BAG_FAMILY_MASK_HERBS', 0x00000020);
79 define('BAG_FAMILY_MASK_ENCHANTING_SUPP', 0x00000040);
80 define('BAG_FAMILY_MASK_ENGINEERING_SUPP', 0x00000080);
81 define('BAG_FAMILY_MASK_KEYS', 0x00000100);
82 define('BAG_FAMILY_MASK_GEMS', 0x00000200);
83 define('BAG_FAMILY_MASK_MINING_SUPP',0x00000400);
84 define('BAG_FAMILY_MASK_SOULBOUND_EQUIPMENT', 0x00000800);
85 define('BAG_FAMILY_MASK_VANITY_PETS',0x00001000);
86 define('BAG_FAMILY_MASK_CURRENCY_TOKENS', 0x00002000);
87 define('BAG_FAMILY_MASK_QUEST_ITEMS', 0x00004000);
89 function getCharacterLevel($character_id)
91 global $cDB;
92 if ($lvl = $cDB->selectCell("SELECT `level` FROM `characters` WHERE `guid`= ?d", $character_id))
93 return $lvl;
94 return 80;
97 function renderSpell($spell_id,$spell_trigger,$spell_charges,$spellcolldown,$spellcategorycooldown)
99 global $UseorEquip, $game_text;
100 if ($spell_id==0) return;
101 $desc = get_spell_details($spell_id);
102 if ($desc)
104 echo '<tr><td><a href="?spell='.$spell_id.'">'.$UseorEquip[$spell_trigger].' '.$desc;
105 if ($spellcolldown>0)
106 echo ' ('.getTimeText($spellcolldown/1000).' cooldown)';
107 echo '</a>';
108 if ($spell_charges > 0 && $spell_charges == (int)$spell_charges)
109 echo '<br>'.sprintf($game_text['charges'], $spell_charges);
110 echo '</td></tr>';
113 function renderPrimalStat($stat_type,$stat_value)
115 if ($stat_value AND $stat_type >= 0 AND $stat_type < 8)
116 echo '<tr><td>'.getItemBonusText($stat_type,$stat_value).'</td></tr>';
118 function renderSpellStat($stat_type,$stat_value)
120 if ($stat_value AND $stat_type > 8 AND $stat_type < 49)
121 echo '<tr><td class=SpellStat>'.getItemBonusText($stat_type, $stat_value).'</td></tr>';
123 // Вывод типа сокета
124 function renderSocket($socket)
126 global $game_text;
127 if ($socket==1) echo '<tr><td class=MetaSock><a href="?s=i&gem=1">'.$game_text['meta_socket'].'</a></td></tr>';
128 if ($socket==2) echo '<tr><td class=RedSock><a href="?s=i&gem=2">'.$game_text['red_socket'].'</a></td></tr>';
129 if ($socket==4) echo '<tr><td class=YellowSock><a href="?s=i&gem=4">'.$game_text['yellow_socket'].'</a></td></tr>';
130 if ($socket==8) echo '<tr><td class=BlueSock><a href="?s=i&gem=8">'.$game_text['blue_socket'].'</a></td></tr>';
132 // Вывод сокета с возможно вставленным камнем
133 function renderSocketed($socket, $sock_gem_enchant)
135 if ($sock_gem_enchant)
137 $sock_enchant = getEnchantment($sock_gem_enchant);
138 $desc ='<a href="?enchant='.$sock_gem_enchant.'">'.$sock_enchant['description'].'</a>';
139 if ($sock_enchant['GemID'])
140 echo '<tr><td class=EnchantSock><img src="'.getItemIconFromItemId($sock_enchant['GemID']).'"> '.$desc.'</td></tr>';
141 else
142 echo '<tr><td class=EnchantSock>'.$desc.'</td></tr>';
144 else // Камня нет выводим как обычный сокет
145 renderSocket($socket);
147 // Вывод энчанта
148 function renderEnchant($item_data, $id, $random_suffix)
150 global $game_text;
151 if ($item_data[$id]==0)
152 return;
153 $desc = getEnchantmentDesc($item_data[$id]);
154 // Имеется рандом суффикс (заменяем $i на рассчётное значение)
155 if ($random_suffix)
157 $i = 0;
158 if ($item_data[$id] == $random_suffix['EnchantID_1']) $i = $random_suffix['Prefix_1'] * $item_data[ITEM_FIELD_SUFFIX_FACTOR]/10000;
159 if ($item_data[$id] == $random_suffix['EnchantID_2']) $i = $random_suffix['Prefix_2'] * $item_data[ITEM_FIELD_SUFFIX_FACTOR]/10000;
160 if ($item_data[$id] == $random_suffix['EnchantID_3']) $i = $random_suffix['Prefix_3'] * $item_data[ITEM_FIELD_SUFFIX_FACTOR]/10000;
161 $desc = str_replace('$i',intval($i),$desc);
163 $time = floor($item_data[$id+1]/1000/60);
164 $charge = $item_data[$id+2];
165 echo '<tr><td class=SpellStat>'.$desc;
166 if ($item_data[$id+1]) echo ' - '.$time.' '.$game_text['min'];
167 if ($item_data[$id+2]) echo ' ('.sprintf($game_text['charges'], $charge).')';
168 echo '</td></tr>';
170 // Одета ли вещь на игроке (если нет данных о игроке выводим как одетую вещь)
171 function isItemOnPlayer($id, $char_eqip)
173 if ($char_eqip)
174 for ($i=0;$i<19;$i++)
175 if ($char_eqip[PLAYER_VISIBLE_ITEM_1_ENTRYID+$i*2]==$id) return 1;
176 return 0;
179 function noBorderItemTable($item, $item_data=0)
181 global $lang;
182 $flags2 = getItemFlags2($item['entry']);
183 echo '<table class=item cellspacing=0><tbody>';
184 renderItemData($item, $item_data);
185 // Extra data
186 if ($flags2 & ITEM_FLAGS2_HORDE_ONLY) echo '<tr><td>'.$lang['reqirement'].': '.$lang['Horde'].'</td></tr>';
187 if ($flags2 & ITEM_FLAGS2_ALLIANCE_ONLY) echo '<tr><td>'.$lang['reqirement'].': '.$lang['Alliance'].'</td></tr>';
189 if ($item['SellPrice'])
190 echo '<tr><td class=sellprice>&nbsp;'.$lang['sell_price'].': '.money($item['SellPrice']).'</td></tr>';
191 else
192 echo '<tr><td class=sellprice>&nbsp;'.$lang['no_sell_price'].'</td></tr>';
193 // echo '<tr><td class=bottom>This is from MaNGOS database!</td></tr>';
194 echo '</tbody></table>';
197 function generateItemTable($item, $item_data=0)
199 echo '<table class=border cellspacing=0 cellpadding=0><tbody>';
200 echo '<tr><td class=btopl></td><td class=btop></td><td class=btopr></td></tr>';
201 echo '<tr><td class=bl></td><td class=bbody>';
202 noBorderItemTable($item, $item_data);
203 echo '</td><td class=br></td></tr>';
204 echo '<tr><td class=bbottoml></td><td class=bbottom></td><td class=bbottomr></td></tr>';
205 echo '</tbody></table>';
208 function renderItemData($item, $item_data=0)
210 global
211 $gBonding,
212 $Quality,
213 $UseorEquip,
214 $game_text;
216 $colorname = $item['Quality'];
217 $bonding = $item['bonding'];
218 $invtype = $item['InventoryType'];
219 $class = $item['class'];
220 $subclass = $item['subclass'];
221 $speed = $item['delay']/1000.00;
222 $ssd = 0;
223 $level = 80;
224 $creator = 0;
225 $giftCreator = 0;
226 $random_suffix = 0;
227 $random_prop = 0;
228 $char_data = 0;
229 $stack_count = 1;
230 if ($item_data)
232 if ($item['ScalingStatValue'] || $item['ScalingStatDistribution'])
233 $level = getCharacterLevel($item_data[ITEM_FIELD_OWNER]);
235 if (intval(-$item_data[ITEM_FIELD_RANDOM_PROPERTIES_ID])>0)
236 $random_suffix = getRandomSuffix(intval(-$item_data[ITEM_FIELD_RANDOM_PROPERTIES_ID]));
237 if (intval($item_data[ITEM_FIELD_RANDOM_PROPERTIES_ID])>0)
238 $random_prop = getRandomProperty(intval($item_data[ITEM_FIELD_RANDOM_PROPERTIES_ID]));
240 if ($item_data[ITEM_FIELD_CREATOR])
241 $creator = getCharacterName($item_data[ITEM_FIELD_CREATOR]);
242 if ($item_data[ITEM_FIELD_GIFTCREATOR])
243 $giftCreator = getCharacterName($item_data[ITEM_FIELD_GIFTCREATOR]);
244 if ($item_data[ITEM_FIELD_STACK_COUNT])
245 $stack_count = $item_data[ITEM_FIELD_STACK_COUNT];
246 if ($random_suffix)
247 $item['name']=$item['name'].' '.$random_suffix['name'];
248 else if ($random_prop)
249 $item['name']=$item['name'].' '.$random_prop['name'];
251 if ($item_data[ITEM_FIELD_FLAGS] & ITEM_FLAGS_BINDED)
252 $bonding = -1;
254 if ($item['ScalingStatDistribution'] && ($ssd = getScalingStatDistribution($item['ScalingStatDistribution'])))
256 if ($ssd['maxlevel'] && $level > $ssd['maxlevel'])
257 $level = $ssd['maxlevel'];
258 $mask = $item['ScalingStatValue'];
259 $ssv = getScalingStatValues($level);
260 $stat_multi = 0;
261 // Stat multiplier
262 if ($mask&0x001F)
264 if ($mask&(1<<0)) $stat_multi = $ssv['multiplier_1'];
265 if ($mask&(1<<1)) $stat_multi = $ssv['multiplier_2'];
266 if ($mask&(1<<2)) $stat_multi = $ssv['multiplier_3'];
267 if ($mask&(1<<3)) $stat_multi = $ssv['multiplier_4'];
268 if ($mask&(1<<4)) $stat_multi = $ssv['multiplier_5'];
270 // Armor mod
271 if ($mask&0x01E0)
273 if ($mask&(1<<5)) $item['armor']=$ssv['multiplier_6'];
274 if ($mask&(1<<6)) $item['armor']=$ssv['multiplier_7'];
275 if ($mask&(1<<7)) $item['armor']=$ssv['multiplier_8'];
276 if ($mask&(1<<8)) $item['armor']=$ssv['multiplier_9'];
278 // DPS mod (min = 70% from averange max = 130%)
279 if ($mask&0x7E00)
281 if ($mask&(1<< 9)) $dps=$ssv['multiplier_10'];
282 if ($mask&(1<<10)) $dps=$ssv['multiplier_11'];
283 if ($mask&(1<<11)) $dps=$ssv['multiplier_12'];
284 if ($mask&(1<<12)) $dps=$ssv['multiplier_13'];
285 if ($mask&(1<<13)) $dps=$ssv['multiplier_14'];
286 if ($mask&(1<<14)) $dps=$ssv['multiplier_15'];
287 $averange = $speed * $dps;
288 $item['dmg_min1'] = floor(0.7*$averange);
289 $item['dmg_max1'] = floor(1.3*$averange);
291 // if ($mask & 0x08000) // spell power
292 // ???=$ssv['multiplier_16'];
293 // if ($mask & 0x10000) // feral AP
294 // ???=$ssv['multiplier_17'];
297 // Вывод имени
298 echo '<tr><td class=name><SPAN class='.$Quality[$colorname].'>'.$item['name'].'</SPAN></td></tr>';
300 // Heroic item (green)
301 if ($item['Flags'] & ITEM_FLAGS_HEROIC)
302 echo '<tr><td class=SpellStat>'.$game_text['item_heroic'].'</td></tr>';
304 if ($item['area'])
305 echo '<tr><td>'.getAreaName($item['area']).'</td></tr>';
307 if ($item['Map'])
308 echo '<tr><td>'.getMapName($item['Map']).'</td></tr>';
310 if ($item['Flags'] & ITEM_FLAGS_CONJURED)
311 echo '<tr><td>'.$game_text['conjured_item'].'</td></tr>';
312 // Вывод привязки вещи
313 if ($bonding)
314 echo '<tr><td>'.$gBonding[$bonding].'</td></tr>';
315 // Вывод того что вещь содержит чтото
316 if ($item['Flags' ]& ITEM_FLAGS_OPENABLE)
317 echo '<tr><td class=SpellStat>'.$game_text['right_click'].'</td></tr>';
318 // <Right Click to Read>
320 // Вывод уникальности вещи
321 if ($item['maxcount']==1)echo '<tr><td class=Unique>'.$game_text['unique'].'</td></tr>';
322 if ($item['maxcount'] >1)echo '<tr><td class=Unique>'.$game_text['unique'].'('.$item['maxcount'].')</td></tr>';
324 $className = getClassName($class, 0);
325 $subClassName = getShortSubclassName($class, $subclass,0);
326 // Зависимые от класса вещи параметры
327 switch ($class)
329 // case 0:// Consumable
330 // break;
331 case 1:// Container
332 echo "<tr><td>".sprintf($game_text['slot'],$item['ContainerSlots'], $subClassName)."</td></tr>";
333 break;
334 case 2:// Weapon
335 echo '<tr><td>'.'<div class=right>'.$subClassName.'</div>'.getInventoryType($invtype,0).'</td></tr>';
336 break;
337 //case 3:// Gem
338 //break;
339 case 4:// Armor
340 if ($invtype==14) $invtype=22;
341 $sub = '';
342 if ($invtype!=16 && $subclass > 0)
343 $sub = '<div class=right>'.$subClassName.'</div>';
344 echo '<tr><td>'.$sub.getInventoryType($invtype,0).'</td></tr>';
345 break;
346 // case 5:// Reagent
347 // break;
348 case 6:// Projectile
349 echo '<tr><td><div class=right>'.$subClassName.'</div>'.$className.'</td></tr>';
350 $dps = ($item['dmg_min1']+$item['dmg_max1'])/2;
351 echo '<tr><td>'.sprintf($game_text['ammo_dps'],$dps).'</td></tr>';
352 break;
353 // case 7:// Trade Goods
354 // break;
355 // case 8:// Generic
356 // break;
357 // case 9:// Recipe
358 // break;
359 // case 10:// Money
360 // break;
361 case 11://Quiver
362 echo '<tr><td>'.sprintf($game_text['slot'], $item['ContainerSlots'], $subClassName).'</td></tr>';
363 break;
364 // case 12: //Quest
365 // break;
366 // case 13: //Key
367 // break;
368 // case 14: //Permanent
369 // break;
370 // case 15: //Misc
371 // break;
372 default:
373 break;
375 // Вывод урона наносимого оружием но не боеприпасами
376 if ($item['dmg_min1'] > 0 AND $class!=6)
378 if ($speed==0)$speed=1;
379 $dps = ($item['dmg_min1']+$item['dmg_max1'])/(2*$speed);
380 $sub = '<div class=right>'.sprintf($game_text['weapon_speed'],$speed).'</div>';
381 echo '<tr><td>'.$sub.sprintf($game_text['weapon_damage'],$item['dmg_min1'], $item['dmg_max1']).'</td></tr>';
382 if ($class==2)
383 echo '<tr><td>'.sprintf($game_text['weapon_dps'],$dps).'</td></tr>';
385 // вывод брони
386 if ($item['armor']) echo '<tr><td>'.sprintf($game_text['iarmor'],$item['armor']).'</td></tr>';
387 // вывод блока
388 if ($item['block']) echo '<tr><td>'.sprintf($game_text['iblock'],$item['block']).'</td></tr>';
389 // Вывод статов на силу, ловкость, стамину, интелект, стамину
390 if ($ssd)
391 for ($i=1;$i<=10;$i++)
392 renderPrimalStat($ssd['statmod_'.$i], $stat_multi * $ssd['modifier_'.$i] / 10000);
393 else
394 for ($i=1;$i<=$item['StatsCount'];$i++)
395 renderPrimalStat($item['stat_type'.$i],$item['stat_value'.$i]);
397 // Вывод резистов
398 if ($item['holy_res' ]) echo "<tr><td>".getResistanceText(1, $item['holy_res' ])."</td></tr>";
399 if ($item['fire_res' ]) echo "<tr><td>".getResistanceText(2, $item['fire_res' ])."</td></tr>";
400 if ($item['nature_res']) echo "<tr><td>".getResistanceText(3, $item['nature_res'])."</td></tr>";
401 if ($item['frost_res' ]) echo "<tr><td>".getResistanceText(4, $item['frost_res' ])."</td></tr>";
402 if ($item['shadow_res']) echo "<tr><td>".getResistanceText(5, $item['shadow_res'])."</td></tr>";
403 if ($item['arcane_res']) echo "<tr><td>".getResistanceText(6, $item['arcane_res'])."</td></tr>";
404 // Описание камней
405 if ($item['GemProperties'])
407 $GemProperties = getGemProperties($item['GemProperties']);
408 echo "<tr><td class=SpellStat>$GemProperties</td></tr>";
410 // Вывод сокетов
411 if ($item_data)
413 renderSocketed($item['socketColor_1'],$item_data[SOCK_ENCHANTMENT_SLOT]);
414 renderSocketed($item['socketColor_2'],$item_data[SOCK_ENCHANTMENT_SLOT_2]);
415 renderSocketed($item['socketColor_3'],$item_data[SOCK_ENCHANTMENT_SLOT_3]);
417 else
419 renderSocket($item['socketColor_1']);
420 renderSocket($item['socketColor_2']);
421 renderSocket($item['socketColor_3']);
423 // Вывод бонуса сокетов (если есть доп инфо выводим данные из нее)
424 if ($item_data)
426 // Вывод активного бонуса
427 if ($item_data[BONUS_ENCHANTMENT_SLOT])
428 echo '<tr><td class=SpellStat>'.sprintf($game_text['socket_bonus'], getEnchantmentDesc($item_data[BONUS_ENCHANTMENT_SLOT])).'</td></tr>';
429 // Вывод не активного бонуса (не выполнены условия)
430 else if ($item['socketBonus'])
431 echo '<tr><td class=disBonus>'.sprintf($game_text['socket_bonus'], getEnchantmentDesc($item['socketBonus'])).'</td></tr>';
433 else if ($item['socketBonus'])
434 echo '<tr><td class=SpellStat>'.sprintf($game_text['socket_bonus'], getEnchantmentDesc($item['socketBonus'])).'</td></tr>';
436 // Вывод энчантов вещи
437 if ($item_data)
439 renderEnchant($item_data,PERM_ENCHANTMENT_SLOT,$random_suffix);
440 renderEnchant($item_data,TEMP_ENCHANTMENT_SLOT,$random_suffix);
441 renderEnchant($item_data,WOTLK_ENCHANTMENT_SLOT,$random_suffix);
442 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_0,$random_suffix);
443 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_1,$random_suffix);
444 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_2,$random_suffix);
445 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_3,$random_suffix);
446 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_4,$random_suffix);
448 else if ($item['RandomProperty'] OR $item['RandomSuffix'])
449 echo '<tr><td class=SpellStat>'.$game_text['random_enchant'].'</td></tr>';
451 // Вывод крепкости
452 if ($item_data && $item_data[ITEM_FIELD_MAXDURABILITY]>0)
453 echo '<tr><td>'.sprintf($game_text['durability'],$item_data[ITEM_FIELD_DURABILITY], $item_data[ITEM_FIELD_MAXDURABILITY]).'</td></tr>';
454 else if ($item['MaxDurability'] > 0)
455 echo '<tr><td>'.sprintf($game_text['durability'], $item['MaxDurability'], $item['MaxDurability']).'</td></tr>';
457 // Вывод требования расы
458 if ($text=getAllowableRace($item['AllowableRace']))
459 echo '<tr><td>'.$game_text['allowable_race'].' '.$text.'</td></tr>';
461 // Вывод требований классов
462 if ($text = getAllowableClass($item['AllowableClass']))
463 echo '<tr><td>'.$game_text['allowable_class'].' '.$text.'</td></tr>';
465 // Вывод времени продолжительности
466 if ($item['Duration'])
468 if ($item['ExtraFlags']&2)
469 echo '<tr><td>'.sprintf($game_text['idurationr'], getTimeText($item['Duration'])).'</td></tr>';
470 else
471 echo '<tr><td>'.sprintf($game_text['iduration'], getTimeText($item['Duration'])).'</td></tr>';
474 // Вывод требования уровня
475 if ($item['RequiredLevel'] > 1)
476 echo '<tr><td class=req>'.sprintf($game_text['req_level'], $item['RequiredLevel']).'</td></tr>';
478 // Уровень предмета
479 if ($item['ItemLevel']) echo '<tr><td>'.sprintf($game_text['ilevel'], $item['ItemLevel']).'</td></tr>';
481 // Вывод prospectable если надо 0x40000
482 if ($item['Flags'] & ITEM_FLAGS_PROSPECTABLE)
483 echo '<tr><td>'.$game_text['prospectable'].'</td></tr>';
485 // Вывод Millable если надо 0x20000000
486 if ($item['Flags'] & ITEM_FLAGS_MILLABLE)
487 echo '<tr><td>'.$game_text['millable'].'</td></tr>';
489 // Вывод требования скила
490 if ($item['RequiredSkill'])
491 echo '<tr><td class=req>'.sprintf($game_text['req_skill'], getSkillName($item['RequiredSkill']), $item['RequiredSkillRank']).'</td></tr>';
493 // Требование знать спелл
494 if ($item['requiredspell'])
495 echo '<tr><td class=req>'.$game_text['req_spell'].' '.getSpellName(getSpell($item['requiredspell'])).'</td></tr>';
497 // Требования арена рейтинга "Requires personal arena rating of %d"; -- %d is the rating number required
498 // $item['RequiredCityRank'] ??
499 // PVP_MEDAL1 = "Protector of Stormwind";
500 // PVP_MEDAL2 = "Overlord of Orgrimmar";
501 // PVP_MEDAL3 = "Thane of Ironforge";
502 // PVP_MEDAL4 = "High Sentinel of Darnassus";
503 // PVP_MEDAL5 = "Deathlord of the Undercity";
504 // PVP_MEDAL6 = "Chieftain of Thunderbluff";
505 // PVP_MEDAL7 = "Avenger of Gnomeregan";
506 // PVP_MEDAL8 = "Voodoo Boss of Sen'jin";
508 // Требования репутации -- Required faction reputation to use the item
509 if ($item['RequiredReputationFaction'])
511 $faction = getFactionName($item['RequiredReputationFaction']);
512 $rank = getReputationRankName($item['RequiredReputationRank']);
513 echo '<tr><td class=faction>'.sprintf($game_text['req_reputation'], $faction, $rank).'</td></tr>';
516 if ($ssd)
517 echo '<tr><td>'.sprintf($game_text['ssd_req_level'], $ssd['maxlevel'], $level).'</td></tr>';
518 // Вывод статов на силу, ловкость, стамину, интелект, стамину
519 if ($ssd)
520 for ($i=1;$i<=10;$i++)
521 renderSpellStat($ssd['statmod_'.$i], $stat_multi * $ssd['modifier_'.$i] / 10000);
522 else
523 for ($i=1;$i<=$item['StatsCount'];$i++)
524 renderSpellStat($item['stat_type'.$i],$item['stat_value'.$i]);
526 if ($item['spellid_1'] != 483)
528 renderSpell($item['spellid_1'],$item['spelltrigger_1'],$item_data?$item_data[ITEM_FIELD_SPELL_CHARGES+0]:$item['spellcharges_1'],$item['spellcooldown_1'],$item['spellcategory_1'],$item['spellcategorycooldown_1']);
529 renderSpell($item['spellid_2'],$item['spelltrigger_2'],$item_data?$item_data[ITEM_FIELD_SPELL_CHARGES+1]:$item['spellcharges_2'],$item['spellcooldown_2'],$item['spellcategory_2'],$item['spellcategorycooldown_2']);
530 renderSpell($item['spellid_3'],$item['spelltrigger_3'],$item_data?$item_data[ITEM_FIELD_SPELL_CHARGES+2]:$item['spellcharges_3'],$item['spellcooldown_3'],$item['spellcategory_3'],$item['spellcategorycooldown_3']);
531 renderSpell($item['spellid_4'],$item['spelltrigger_4'],$item_data?$item_data[ITEM_FIELD_SPELL_CHARGES+3]:$item['spellcharges_4'],$item['spellcooldown_4'],$item['spellcategory_4'],$item['spellcategorycooldown_4']);
532 renderSpell($item['spellid_5'],$item['spelltrigger_5'],$item_data?$item_data[ITEM_FIELD_SPELL_CHARGES+4]:$item['spellcharges_5'],$item['spellcooldown_5'],$item['spellcategory_5'],$item['spellcategorycooldown_5']);
535 if ($item['itemset'])
537 $set=getItemSet($item['itemset']);
538 if ($set==0) echo '<tr><td class=itemsetname>&nbsp;&nbsp;Unknown set - '.$item['itemset'].'</td></tr>';
539 else
541 // Получаем игрока чтобы вывести инфу о сете
542 if ($item_data && $char=getCharacter($item_data[ITEM_FIELD_OWNER]))
543 $char_data = explode(' ',$char['equipmentCache']);
545 $text = "";
546 $count = 0;
547 $itemnum = 0;
548 // Подсчитываем всего вещей в сете (а также если на игроке то сколько из вещей сета на нём)
549 // Одновременно составяем список
550 for($i=1;$i<18;$i++)
551 if ($setitem = $set['item_'.$i])
553 $count++;
554 $name=getItemName($setitem);
555 if (isItemOnPlayer($setitem, $char_data))
557 $itemnum++;
558 $text = $text.'<tr><td class=enSetName><a href="?item='.$setitem.'">'.$name.'</a></td></tr>';
560 else
561 $text = $text.'<tr><td class=disSetName><a href="?item='.$setitem.'">'.$name.'</a></td></tr>';
563 echo '<tr><td class=itemsetname><a href="?itemset='.$set['id'].'">'.$set['name']."</a> ($itemnum/$count)</td></tr>";
564 if ($set['req_skill'])
565 echo '<tr><td class=req>'.sprintf($game_text['req_skill'], getSkillName($set['req_skill']), $set['req_skill_value']).'</td></tr>';
566 echo $text;
567 // Выводим бонусы сета (если на игроке - то активны ион или нет)
568 for($i=1;$i<9;$i++)
569 if ($setSpell = $set['spell_'.$i])
571 $name=get_spell_details($setSpell);
572 $num=$set['count_'.$i];
573 if ($char_data)
575 $iclass = ($num<=$itemnum) ? 'enSpell' : 'disSpell';
576 echo '<tr><td class='.$iclass.'><a href="?spell='.$setSpell.'">('.$num.') '.$name.'</a></td></tr>';
578 else
579 echo '<tr><td><a href="?spell='.$setSpell.'">('.$num.') '.$name.'</a></td></tr>';
584 if ($item['description'] != "")
586 if ($item['spellid_1'] == 483)
588 echo '<tr><td><a href="?spell='.$item['spellid_2'].'">'.$UseorEquip[$item['spelltrigger_2']].' '.$item['description'].'</a></td></tr>';
589 if ($spell = getSpell($item['spellid_2']))
591 if ($ritem = getItem($spell['EffectItemType_1']))
593 echo '<tr><td>&nbsp;</td></tr>';
594 renderItemData($ritem);
596 if ($req = getRecipeReqString($spell))
598 echo '<tr><td>&nbsp;</td></tr>';
599 echo '<tr><td>'.$game_text['req_ingridients'].' '.$req.'</td></tr>';
603 else
604 echo '<tr><td class=itemdesc>&quot;'.$item['description'].'&quot;</td></tr>';
607 // Written by %s
608 if ($creator)
609 echo '<tr><td class=enSpell>&lt;'.sprintf($game_text['made_by'], $creator).'&gt;</td></tr>';
611 if ($item['startquest'])
612 echo '<tr><td>'.$game_text['start_quest'].'</td></tr>';