Требование: PHP => 5.3, часть 2
[cswow.git] / include / item_table.php
blobdff225daea6666fa70552a319d4963d2a89428ea
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'].':&nbsp;'.$lang['Horde'].'</td></tr>';
187 if ($flags2 & ITEM_FLAGS2_ALLIANCE_ONLY) echo '<tr><td>'.$lang['reqirement'].':&nbsp;'.$lang['Alliance'].'</td></tr>';
188 if ($item['SellPrice'])
189 echo '<tr><td class=sellprice>&nbsp;'.$lang['sell_price'].':&nbsp;'.money($item['SellPrice']).'</td></tr>';
190 else
191 echo '<tr><td class=sellprice>&nbsp;'.$lang['no_sell_price'].'</td></tr>';
192 echo '</tbody></table>';
195 function generateItemTable($item, $item_data=0)
197 echo '<table class=border cellspacing=0 cellpadding=0><tbody>';
198 echo '<tr><td class=btopl></td><td class=btop></td><td class=btopr></td></tr>';
199 echo '<tr><td class=bl></td><td class=bbody>';
200 noBorderItemTable($item, $item_data);
201 echo '</td><td class=br></td></tr>';
202 echo '<tr><td class=bbottoml></td><td class=bbottom></td><td class=bbottomr></td></tr>';
203 echo '</tbody></table>';
206 function renderItemData($item, $item_data=0)
208 global
209 $gBonding,
210 $Quality,
211 $UseorEquip,
212 $game_text;
214 $colorname = $item['Quality'];
215 $bonding = $item['bonding'];
216 $invtype = $item['InventoryType'];
217 $class = $item['class'];
218 $subclass = $item['subclass'];
219 $speed = $item['delay']/1000.00;
220 $ssd = 0;
221 $level = 80;
222 $creator = 0;
223 $giftCreator = 0;
224 $random_suffix = 0;
225 $random_prop = 0;
226 $char_data = 0;
227 $stack_count = 1;
228 if ($item_data)
230 if ($item['ScalingStatValue'] || $item['ScalingStatDistribution'])
231 $level = getCharacterLevel($item_data[ITEM_FIELD_OWNER]);
233 if (intval(-$item_data[ITEM_FIELD_RANDOM_PROPERTIES_ID])>0)
234 $random_suffix = getRandomSuffix(intval(-$item_data[ITEM_FIELD_RANDOM_PROPERTIES_ID]));
235 if (intval($item_data[ITEM_FIELD_RANDOM_PROPERTIES_ID])>0)
236 $random_prop = getRandomProperty(intval($item_data[ITEM_FIELD_RANDOM_PROPERTIES_ID]));
238 if ($item_data[ITEM_FIELD_CREATOR])
239 $creator = getCharacterName($item_data[ITEM_FIELD_CREATOR]);
240 if ($item_data[ITEM_FIELD_GIFTCREATOR])
241 $giftCreator = getCharacterName($item_data[ITEM_FIELD_GIFTCREATOR]);
242 if ($item_data[ITEM_FIELD_STACK_COUNT])
243 $stack_count = $item_data[ITEM_FIELD_STACK_COUNT];
244 if ($random_suffix)
245 $item['name']=$item['name'].' '.$random_suffix['name'];
246 else if ($random_prop)
247 $item['name']=$item['name'].' '.$random_prop['name'];
249 if ($item_data[ITEM_FIELD_FLAGS] & ITEM_FLAGS_BINDED)
250 $bonding = -1;
252 if ($item['ScalingStatDistribution'] && ($ssd = getScalingStatDistribution($item['ScalingStatDistribution'])))
254 if ($ssd['maxlevel'] && $level > $ssd['maxlevel'])
255 $level = $ssd['maxlevel'];
256 $mask = $item['ScalingStatValue'];
257 $ssv = getScalingStatValues($level);
258 $stat_multi = 0;
259 // Stat multiplier
260 if ($mask&0x001F)
262 if ($mask&(1<<0)) $stat_multi = $ssv['multiplier_1'];
263 if ($mask&(1<<1)) $stat_multi = $ssv['multiplier_2'];
264 if ($mask&(1<<2)) $stat_multi = $ssv['multiplier_3'];
265 if ($mask&(1<<3)) $stat_multi = $ssv['multiplier_4'];
266 if ($mask&(1<<4)) $stat_multi = $ssv['multiplier_5'];
268 // Armor mod
269 if ($mask&0x01E0)
271 if ($mask&(1<<5)) $item['armor']=$ssv['multiplier_6'];
272 if ($mask&(1<<6)) $item['armor']=$ssv['multiplier_7'];
273 if ($mask&(1<<7)) $item['armor']=$ssv['multiplier_8'];
274 if ($mask&(1<<8)) $item['armor']=$ssv['multiplier_9'];
276 // DPS mod (min = 70% from averange max = 130%)
277 if ($mask&0x7E00)
279 if ($mask&(1<< 9)) $dps=$ssv['multiplier_10'];
280 if ($mask&(1<<10)) $dps=$ssv['multiplier_11'];
281 if ($mask&(1<<11)) $dps=$ssv['multiplier_12'];
282 if ($mask&(1<<12)) $dps=$ssv['multiplier_13'];
283 if ($mask&(1<<13)) $dps=$ssv['multiplier_14'];
284 if ($mask&(1<<14)) $dps=$ssv['multiplier_15'];
285 $averange = $speed * $dps;
286 $item['dmg_min1'] = floor(0.7*$averange);
287 $item['dmg_max1'] = floor(1.3*$averange);
289 // if ($mask & 0x08000) // spell power
290 // ???=$ssv['multiplier_16'];
291 // if ($mask & 0x10000) // feral AP
292 // ???=$ssv['multiplier_17'];
295 // Вывод имени
296 echo '<tr><td class=name><span class='.$Quality[$colorname].'>'.$item['name'].'</span></td></tr>';
298 // Heroic item (green)
299 if ($item['Flags'] & ITEM_FLAGS_HEROIC)
300 echo '<tr><td class=SpellStat>'.$game_text['item_heroic'].'</td></tr>';
301 if ($item['area'])
302 echo '<tr><td>'.getAreaName($item['area']).'</td></tr>';
303 if ($item['Map'])
304 echo '<tr><td>'.getMapName($item['Map']).'</td></tr>';
305 if ($item['Flags'] & ITEM_FLAGS_CONJURED)
306 echo '<tr><td>'.$game_text['conjured_item'].'</td></tr>';
307 // Вывод привязки вещи
308 if ($bonding)
309 echo '<tr><td>'.$gBonding[$bonding].'</td></tr>';
310 // Вывод того что вещь содержит чтото
311 if ($item['Flags' ]& ITEM_FLAGS_OPENABLE)
312 echo '<tr><td class=SpellStat>'.$game_text['right_click'].'</td></tr>';
313 // <Right Click to Read>
314 // Вывод уникальности вещи
315 if ($item['maxcount']==1)echo '<tr><td class=Unique>'.$game_text['unique'].'</td></tr>';
316 if ($item['maxcount'] >1)echo '<tr><td class=Unique>'.$game_text['unique'].'('.$item['maxcount'].')</td></tr>';
318 $className = getClassName($class, 0);
319 $subClassName = getShortSubclassName($class, $subclass,0);
320 // Зависимые от класса вещи параметры
321 switch ($class)
323 // case 0:// Consumable
324 // break;
325 case 1:// Container
326 echo "<tr><td>".sprintf($game_text['slot'],$item['ContainerSlots'], $subClassName)."</td></tr>";
327 break;
328 case 2:// Weapon
329 echo '<tr><td>'.'<div class=right>'.$subClassName.'</div>'.getInventoryType($invtype,0).'</td></tr>';
330 break;
331 //case 3:// Gem
332 //break;
333 case 4:// Armor
334 if ($invtype==14) $invtype=22;
335 $sub = '';
336 if ($invtype!=16 && $subclass > 0)
337 $sub = '<div class=right>'.$subClassName.'</div>';
338 echo '<tr><td>'.$sub.getInventoryType($invtype,0).'</td></tr>';
339 break;
340 // case 5:// Reagent
341 // break;
342 case 6:// Projectile
343 echo '<tr><td><div class=right>'.$subClassName.'</div>'.$className.'</td></tr>';
344 $dps = ($item['dmg_min1']+$item['dmg_max1'])/2;
345 echo '<tr><td>'.sprintf($game_text['ammo_dps'],$dps).'</td></tr>';
346 break;
347 // case 7:// Trade Goods
348 // break;
349 // case 8:// Generic
350 // break;
351 // case 9:// Recipe
352 // break;
353 // case 10:// Money
354 // break;
355 case 11://Quiver
356 echo '<tr><td>'.sprintf($game_text['slot'], $item['ContainerSlots'], $subClassName).'</td></tr>';
357 break;
358 // case 12: //Quest
359 // break;
360 // case 13: //Key
361 // break;
362 // case 14: //Permanent
363 // break;
364 // case 15: //Misc
365 // break;
366 default:
367 break;
369 // Вывод урона наносимого оружием но не боеприпасами
370 if ($item['dmg_min1'] > 0 AND $class!=6)
372 if ($speed==0)$speed=1;
373 $dps = ($item['dmg_min1']+$item['dmg_max1'])/(2*$speed);
374 $sub = '<div class=right>'.sprintf($game_text['weapon_speed'],$speed).'</div>';
375 echo '<tr><td>'.$sub.sprintf($game_text['weapon_damage'],$item['dmg_min1'], $item['dmg_max1']).'</td></tr>';
376 if ($class==2)
377 echo '<tr><td>'.sprintf($game_text['weapon_dps'],$dps).'</td></tr>';
379 // вывод брони
380 if ($item['armor']) echo '<tr><td>'.sprintf($game_text['iarmor'],$item['armor']).'</td></tr>';
381 // вывод блока
382 if ($item['block']) echo '<tr><td>'.sprintf($game_text['iblock'],$item['block']).'</td></tr>';
383 // Вывод статов на силу, ловкость, стамину, интелект, стамину
384 if ($ssd)
385 for ($i=1;$i<=10;$i++)
386 renderPrimalStat($ssd['statmod_'.$i], $stat_multi * $ssd['modifier_'.$i] / 10000);
387 else
388 for ($i=1;$i<=$item['StatsCount'];$i++)
389 renderPrimalStat($item['stat_type'.$i],$item['stat_value'.$i]);
391 // Вывод резистов
392 if ($item['holy_res' ]) echo "<tr><td>".getResistanceText(1, $item['holy_res' ])."</td></tr>";
393 if ($item['fire_res' ]) echo "<tr><td>".getResistanceText(2, $item['fire_res' ])."</td></tr>";
394 if ($item['nature_res']) echo "<tr><td>".getResistanceText(3, $item['nature_res'])."</td></tr>";
395 if ($item['frost_res' ]) echo "<tr><td>".getResistanceText(4, $item['frost_res' ])."</td></tr>";
396 if ($item['shadow_res']) echo "<tr><td>".getResistanceText(5, $item['shadow_res'])."</td></tr>";
397 if ($item['arcane_res']) echo "<tr><td>".getResistanceText(6, $item['arcane_res'])."</td></tr>";
398 // Описание камней
399 if ($item['GemProperties'])
401 $GemProperties = getGemProperties($item['GemProperties']);
402 echo "<tr><td class=SpellStat>$GemProperties</td></tr>";
404 // Вывод сокетов
405 if ($item_data)
407 renderSocketed($item['socketColor_1'],$item_data[SOCK_ENCHANTMENT_SLOT]);
408 renderSocketed($item['socketColor_2'],$item_data[SOCK_ENCHANTMENT_SLOT_2]);
409 renderSocketed($item['socketColor_3'],$item_data[SOCK_ENCHANTMENT_SLOT_3]);
411 else
413 renderSocket($item['socketColor_1']);
414 renderSocket($item['socketColor_2']);
415 renderSocket($item['socketColor_3']);
417 // Вывод бонуса сокетов (если есть доп инфо выводим данные из нее)
418 if ($item_data)
420 // Вывод активного бонуса
421 if ($item_data[BONUS_ENCHANTMENT_SLOT])
422 echo '<tr><td class=SpellStat>'.sprintf($game_text['socket_bonus'], getEnchantmentDesc($item_data[BONUS_ENCHANTMENT_SLOT])).'</td></tr>';
423 // Вывод не активного бонуса (не выполнены условия)
424 else if ($item['socketBonus'])
425 echo '<tr><td class=disBonus>'.sprintf($game_text['socket_bonus'], getEnchantmentDesc($item['socketBonus'])).'</td></tr>';
427 else if ($item['socketBonus'])
428 echo '<tr><td class=SpellStat>'.sprintf($game_text['socket_bonus'], getEnchantmentDesc($item['socketBonus'])).'</td></tr>';
430 // Вывод энчантов вещи
431 if ($item_data)
433 renderEnchant($item_data,PERM_ENCHANTMENT_SLOT,$random_suffix);
434 renderEnchant($item_data,TEMP_ENCHANTMENT_SLOT,$random_suffix);
435 renderEnchant($item_data,WOTLK_ENCHANTMENT_SLOT,$random_suffix);
436 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_0,$random_suffix);
437 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_1,$random_suffix);
438 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_2,$random_suffix);
439 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_3,$random_suffix);
440 renderEnchant($item_data,PROP_ENCHANTMENT_SLOT_4,$random_suffix);
442 else if ($item['RandomProperty'] OR $item['RandomSuffix'])
443 echo '<tr><td class=SpellStat>'.$game_text['random_enchant'].'</td></tr>';
445 // Вывод крепкости
446 if ($item_data && $item_data[ITEM_FIELD_MAXDURABILITY]>0)
447 echo '<tr><td>'.sprintf($game_text['durability'],$item_data[ITEM_FIELD_DURABILITY], $item_data[ITEM_FIELD_MAXDURABILITY]).'</td></tr>';
448 else if ($item['MaxDurability'] > 0)
449 echo '<tr><td>'.sprintf($game_text['durability'], $item['MaxDurability'], $item['MaxDurability']).'</td></tr>';
451 // Вывод требования расы
452 if ($text=getAllowableRace($item['AllowableRace']))
453 echo '<tr><td>'.$game_text['allowable_race'].' '.$text.'</td></tr>';
455 // Вывод требований классов
456 if ($text = getAllowableClass($item['AllowableClass']))
457 echo '<tr><td>'.$game_text['allowable_class'].' '.$text.'</td></tr>';
459 // Вывод времени продолжительности
460 if ($item['Duration'])
462 if ($item['ExtraFlags']&2)
463 echo '<tr><td>'.sprintf($game_text['idurationr'], getTimeText($item['Duration'])).'</td></tr>';
464 else
465 echo '<tr><td>'.sprintf($game_text['iduration'], getTimeText($item['Duration'])).'</td></tr>';
468 // Вывод требования уровня
469 if ($item['RequiredLevel'] > 1)
470 echo '<tr><td class=req>'.sprintf($game_text['req_level'], $item['RequiredLevel']).'</td></tr>';
472 // Уровень предмета
473 if ($item['ItemLevel']) echo '<tr><td>'.sprintf($game_text['ilevel'], $item['ItemLevel']).'</td></tr>';
475 // Вывод prospectable если надо 0x40000
476 if ($item['Flags'] & ITEM_FLAGS_PROSPECTABLE)
477 echo '<tr><td>'.$game_text['prospectable'].'</td></tr>';
479 // Вывод Millable если надо 0x20000000
480 if ($item['Flags'] & ITEM_FLAGS_MILLABLE)
481 echo '<tr><td>'.$game_text['millable'].'</td></tr>';
483 // Вывод требования скила
484 if ($item['RequiredSkill'])
485 echo '<tr><td class=req>'.sprintf($game_text['req_skill'], getSkillName($item['RequiredSkill']), $item['RequiredSkillRank']).'</td></tr>';
487 // Требование знать спелл
488 if ($item['requiredspell'])
489 echo '<tr><td class=req>'.$game_text['req_spell'].' '.getSpellName(getSpell($item['requiredspell'])).'</td></tr>';
491 // Требования арена рейтинга "Requires personal arena rating of %d"; -- %d is the rating number required
492 // $item['RequiredCityRank'] ??
493 // PVP_MEDAL1 = "Protector of Stormwind";
494 // PVP_MEDAL2 = "Overlord of Orgrimmar";
495 // PVP_MEDAL3 = "Thane of Ironforge";
496 // PVP_MEDAL4 = "High Sentinel of Darnassus";
497 // PVP_MEDAL5 = "Deathlord of the Undercity";
498 // PVP_MEDAL6 = "Chieftain of Thunderbluff";
499 // PVP_MEDAL7 = "Avenger of Gnomeregan";
500 // PVP_MEDAL8 = "Voodoo Boss of Sen'jin";
502 // Требования репутации -- Required faction reputation to use the item
503 if ($item['RequiredReputationFaction'])
505 $faction = getFactionName($item['RequiredReputationFaction']);
506 $rank = getReputationRankName($item['RequiredReputationRank']);
507 echo '<tr><td class=faction>'.sprintf($game_text['req_reputation'], $faction, $rank).'</td></tr>';
510 if ($ssd)
511 echo '<tr><td>'.sprintf($game_text['ssd_req_level'], $ssd['maxlevel'], $level).'</td></tr>';
512 // Вывод статов на силу, ловкость, стамину, интелект, стамину
513 if ($ssd)
514 for ($i=1;$i<=10;$i++)
515 renderSpellStat($ssd['statmod_'.$i], $stat_multi * $ssd['modifier_'.$i] / 10000);
516 else
517 for ($i=1;$i<=$item['StatsCount'];$i++)
518 renderSpellStat($item['stat_type'.$i],$item['stat_value'.$i]);
520 if ($item['spellid_1'] != 483 AND $item['spellid_1'] != 55884)
522 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']);
523 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']);
524 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']);
525 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']);
526 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']);
529 if ($item['itemset'])
531 $set=getItemSet($item['itemset']);
532 if ($set==0) echo '<tr><td class=itemsetname>&nbsp;&nbsp;Unknown set - '.$item['itemset'].'</td></tr>';
533 else
535 // Получаем игрока чтобы вывести инфу о сете
536 if ($item_data && $char=getCharacter($item_data[ITEM_FIELD_OWNER]))
537 $char_data = explode(' ',$char['equipmentCache']);
539 $text = "";
540 $count = 0;
541 $itemnum = 0;
542 // Подсчитываем всего вещей в сете (а также если на игроке то сколько из вещей сета на нём)
543 // Одновременно составяем список
544 for($i=1;$i<18;$i++)
545 if ($setitem = $set['item_'.$i])
547 $count++;
548 $name=getItemName($setitem);
549 if (isItemOnPlayer($setitem, $char_data))
551 $itemnum++;
552 $text = $text.'<tr><td class=enSetName><a href="?item='.$setitem.'">'.$name.'</a></td></tr>';
554 else
555 $text = $text.'<tr><td class=disSetName><a href="?item='.$setitem.'">'.$name.'</a></td></tr>';
557 echo '<tr><td class=itemsetname><a href="?itemset='.$set['id'].'">'.$set['name']."</a> ($itemnum/$count)</td></tr>";
558 if ($set['req_skill'])
559 echo '<tr><td class=req>'.sprintf($game_text['req_skill'], getSkillName($set['req_skill']), $set['req_skill_value']).'</td></tr>';
560 echo $text;
561 // Выводим бонусы сета (если на игроке - то активны ион или нет)
562 for($i=1;$i<9;$i++)
563 if ($setSpell = $set['spell_'.$i])
565 $name=get_spell_details($setSpell);
566 $num=$set['count_'.$i];
567 if ($char_data)
569 $iclass = ($num<=$itemnum) ? 'enSpell' : 'disSpell';
570 echo '<tr><td class='.$iclass.'><a href="?spell='.$setSpell.'">('.$num.') '.$name.'</a></td></tr>';
572 else
573 echo '<tr><td><a href="?spell='.$setSpell.'">('.$num.') '.$name.'</a></td></tr>';
578 if ($item['description'] != "")
580 if ($item['spellid_1'] == 483 OR $item['spellid_1'] == 55884)
582 echo '<tr><td><a href="?spell='.$item['spellid_2'].'">'.$UseorEquip[$item['spelltrigger_2']].' '.$item['description'].'</a></td></tr>';
583 if ($spell = getSpell($item['spellid_2']))
585 if ($ritem = getItem($spell['EffectItemType_1']))
587 echo '<tr><td>&nbsp;</td></tr>';
588 renderItemData($ritem);
590 if ($req = getRecipeReqString($spell))
592 echo '<tr><td>&nbsp;</td></tr>';
593 echo '<tr><td>'.$game_text['req_ingridients'].' '.$req.'</td></tr>';
597 else
598 echo '<tr><td class=itemdesc>&quot;'.$item['description'].'&quot;</td></tr>';
601 // Written by %s
602 if ($creator)
603 echo '<tr><td class=enSpell>&lt;'.sprintf($game_text['made_by'], $creator).'&gt;</td></tr>';
605 if ($item['startquest'])
606 echo '<tr><td>'.$game_text['start_quest'].'</td></tr>';