2017-01-15 14:47:25 +01:00

1032 lines
35 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* UDWBase: WOWDB Web Interface
*
* © UDW 2009-2011
*
* Released under the terms and conditions of the
* GNU General Public License (http://gnu.org).
*
*/
require_once 'includes/allitems.php';
// Названия аур
$spell_aura_names = array(
0 => 'None',
1 => 'Bind Sight',
2 => 'Mod Possess',
3 => 'Periodic Damage',
4 => 'Dummy',
5 => 'Mod Confuse',
6 => 'Mod Charm',
7 => 'Mod Fear',
8 => 'Periodic Heal',
9 => 'Mod Attack Speed',
10 => 'Mod Threat',
11 => 'Taunt',
12 => 'Stun',
13 => 'Mod Damage Done',
14 => 'Mod Damage Taken',
15 => 'Damage Shield',
16 => 'Mod Stealth',
17 => 'Mod Detect',
18 => 'Mod Invisibility',
19 => 'Mod Invisibility Detection',
20 => 'OBS Mod Intellect',
21 => 'OBS Mod Spirit',
22 => 'Mod Resistance',
23 => 'Periodic Trigger',
24 => 'Periodic Energize',
25 => 'Pacify',
26 => 'Root',
27 => 'Silence',
28 => 'Reflect Spells %',
29 => 'Mod Stat',
30 => 'Mod Skill',
31 => 'Mod Speed',
32 => 'Mod Speed Mounted',
33 => 'Mod Speed Slow',
34 => 'Mod Increase Health',
35 => 'Mod Increase Energy',
36 => 'Shapeshift',
37 => 'Immune Effect',
38 => 'Immune State',
39 => 'Immune School',
40 => 'Immune Damage',
41 => 'Immune Dispel Type',
42 => 'Proc Trigger Spell',
43 => 'Proc Trigger Damage',
44 => 'Track Creatures',
45 => 'Track Resources',
46 => 'Mod Parry Skill',
47 => 'Mod Parry Percent',
48 => 'Mod Dodge Skill',
49 => 'Mod Dodge Percent',
50 => 'Mod Block Skill',
51 => 'Mod Block Percent',
52 => 'Mod Crit Percent',
53 => 'Periodic Leech',
54 => 'Mod Hit Chance',
55 => 'Mod Spell Hit Chance',
56 => 'Transform',
57 => 'Mod Spell Crit Chance',
58 => 'Mod Speed Swim',
59 => 'Mod Creature Dmg Done',
60 => 'Pacify & Silence',
61 => 'Mod Scale',
62 => 'Periodic Health Funnel',
63 => 'Periodic Mana Funnel',
64 => 'Periodic Mana Leech',
65 => 'Haste - Spells',
66 => 'Feign Death',
67 => 'Disarm',
68 => 'Mod Stalked',
69 => 'School Absorb',
70 => 'Extra Attacks',
71 => 'Mod School Spell Crit Chance',
72 => 'Mod Power Cost',
73 => 'Mod School Power Cost',
74 => 'Reflect School Spells %',
75 => 'Mod Language',
76 => 'Far Sight',
77 => 'Immune Mechanic',
78 => 'Mounted',
79 => 'Mod Dmg %',
80 => 'Mod Stat %',
81 => 'Split Damage',
82 => 'Water Breathing',
83 => 'Mod Base Resistance',
84 => 'Mod Health Regen',
85 => 'Mod Power Regen',
86 => 'Create Death Item',
87 => 'Mod Dmg % Taken',
88 => 'Mod Health Regen Percent',
89 => 'Periodic Damage Percent',
90 => 'Mod Resist Chance',
91 => 'Mod Detect Range',
92 => 'Prevent Fleeing',
93 => 'Mod Uninteractible',
94 => 'Interrupt Regen',
95 => 'Ghost',
96 => 'Spell Magnet',
97 => 'Mana Shield',
98 => 'Mod Skill Talent',
99 => 'Mod Attack Power',
100 => 'Auras Visible',
101 => 'Mod Resistance %',
102 => 'Mod Creature Attack Power',
103 => 'Mod Total Threat (Fade)',
104 => 'Water Walk',
105 => 'Feather Fall',
106 => 'Hover',
107 => 'Add Flat Modifier',
108 => 'Add % Modifier',
109 => 'Add Class Target Trigger',
110 => 'Mod Power Regen %',
111 => 'Add Class Caster Hit Trigger',
112 => 'Override Class Scripts',
113 => 'Mod Ranged Dmg Taken',
114 => 'Mod Ranged % Dmg Taken',
115 => 'Mod Healing',
116 => 'Regen During Combat',
117 => 'Mod Mechanic Resistance',
118 => 'Mod Healing %',
119 => 'Share Pet Tracking',
120 => 'Untrackable',
121 => 'Empathy (Lore, whatever)',
122 => 'Mod Offhand Dmg %',
123 => 'Mod Power Cost %',
124 => 'Mod Ranged Attack Power',
125 => 'Mod Melee Dmg Taken',
126 => 'Mod Melee % Dmg Taken',
127 => 'Rngd Atk Pwr Attckr Bonus',
128 => 'Mod Possess Pet',
129 => 'Mod Speed Always',
130 => 'Mod Mounted Speed Always',
131 => 'Mod Creature Ranged Attack Power',
132 => 'Mod Increase Energy %',
133 => 'Mod Max Health %',
134 => 'Mod Interrupted Mana Regen',
135 => 'Mod Healing Done',
136 => 'Mod Healing Done %',
137 => 'Mod Total Stat %',
138 => 'Haste - Melee',
139 => 'Force Reaction',
140 => 'Haste - Ranged',
141 => 'Haste - Ranged (Ammo Only)',
142 => 'Mod Base Resistance %',
143 => 'Mod Resistance Exclusive',
144 => 'Safe Fall',
145 => 'Charisma',
146 => 'Persuaded',
147 => 'Add Creature Immunity',
148 => 'Retain Combo Points',
149 => 'Resist Pushback',
150 => 'Mod Shield Block %',
151 => 'Track Stealthed',
152 => 'Mod Detected Range',
153 => 'Split Damage Flat',
154 => 'Stealth Level Modifier',
155 => 'Mod Water Breathing',
156 => 'Mod Reputation Gain',
157 => 'Mod Pet Damage',
);
// Названия эффектов спеллов
$spell_effect_names = array(
0 => 'None',
1 => 'Instakill',
2 => 'School Damage',
3 => 'Dummy',
4 => 'Portal Teleport',
5 => 'Teleport Units',
6 => 'Apply Aura',
7 => 'Environmental Damage',
8 => 'Power Drain',
9 => 'Health Leech',
10 => 'Heal',
11 => 'Bind',
12 => 'Portal',
13 => 'Ritual Base',
14 => 'Ritual Specialize',
15 => 'Ritual Activate Portal',
16 => 'Quest Complete',
17 => 'Weapon Damage + (noschool)',
18 => 'Resurrect',
19 => 'Extra Attacks',
20 => 'Dodge',
21 => 'Evade',
22 => 'Parry',
23 => 'Block',
24 => 'Create Item',
25 => 'Weapon',
26 => 'Defense',
27 => 'Persistent Area Aura',
28 => 'Summon',
29 => 'Leap',
30 => 'Energize',
31 => 'Weapon % Dmg',
32 => 'Trigger Missile',
33 => 'Open Lock',
35 => 'Apply Area Aura',
36 => 'Learn Spell',
37 => 'Spell Defense',
38 => 'Dispel',
39 => 'Language',
40 => 'Dual Wield',
41 => 'Summon Wild',
42 => 'Summon Guardian',
44 => 'Skill Step',
46 => 'Spawn',
47 => 'Spell Cast UI',
48 => 'Stealth',
49 => 'Detect',
50 => 'Summon Object',
51 => 'Force Critical Hit',
52 => 'Guarantee Hit',
53 => 'Enchant Item Permanent',
54 => 'Enchant Item Temporary',
55 => 'Tame Creature',
56 => 'Summon Pet',
57 => 'Learn Pet Spell',
58 => 'Weapon Damage +',
59 => 'Open Lock (Item)',
60 => 'Proficiency',
61 => 'Send Event',
62 => 'Power Burn',
63 => 'Threat',
64 => 'Trigger Spell',
65 => 'Health Funnel',
66 => 'Power Funnel',
67 => 'Heal Max Health',
68 => 'Interrupt Cast',
69 => 'Distract',
70 => 'Pull',
71 => 'Pickpocket',
72 => 'Add Farsight',
73 => 'Summon Possessed',
74 => 'Summon Totem',
75 => 'Heal Mechanical',
76 => 'Summon Object (Wild)',
77 => 'Script Effect',
78 => 'Attack',
79 => 'Sanctuary',
80 => 'Add Combo Points',
81 => 'Create House',
82 => 'Bind Sight',
83 => 'Duel',
84 => 'Stuck',
85 => 'Summon Player',
86 => 'Activate Object',
87 => 'Summon Totem (slot 1)',
88 => 'Summon Totem (slot 2)',
89 => 'Summon Totem (slot 3)',
90 => 'Summon Totem (slot 4)',
91 => 'Threat (All)',
92 => 'Enchant Held Item',
93 => 'Summon Phantasm',
94 => 'Self Resurrect',
95 => 'Skinning',
96 => 'Charge',
97 => 'Summon Critter',
98 => 'Knock Back',
99 => 'Disenchant',
100 => 'Inebriate',
101 => 'Feed Pet',
102 => 'Dismiss Pet',
103 => 'Reputation',
104 => 'Summon Object (slot 1)',
105 => 'Summon Object (slot 2)',
106 => 'Summon Object (slot 3)',
107 => 'Summon Object (slot 4)',
108 => 'Dispel Mechanic',
109 => 'Summon Dead Pet',
110 => 'Destroy All Totems',
111 => 'Durability Damage',
112 => 'Summon Demon',
113 => 'Resurrect (Flat)',
114 => 'Attack Me'
);
$spell_cols[0] = array('spellID', 'iconname', 'effect1itemtype', 'effect1Aura');
$spell_cols[1] = array('spellID', 'iconname', 'durationID', 'tooltip', 'spellname', 'rank', 'rangeID', 'manacost', 'manacostpercent', 'spellcasttimesID', 'cooldown', 'tool1', 'tool2', 'reagent1', 'reagent2', 'reagent3', 'reagent4', 'reagent5', 'reagent6', 'reagent7', 'reagent8', 'effect1BasePoints', 'effect2BasePoints', 'effect3BasePoints', 'effect1Amplitude', 'effect2Amplitude', 'effect3Amplitude', 'effect1DieSides', 'effect2DieSides', 'effect3DieSides', 'effect1ChainTarget', 'effect2ChainTarget', 'effect3ChainTarget', 'reagentcount1', 'reagentcount2', 'reagentcount3', 'reagentcount4', 'reagentcount5', 'reagentcount6', 'reagentcount7', 'reagentcount8', 'effect1radius', 'effect2radius', 'effect3radius', 'effect1MiscValue', 'effect2MiscValue', 'effect3MiscValue', 'ChannelInterruptFlags', 'procChance', 'procCharges', 'effect_1_proc_chance', 'effect_2_proc_chance', 'effect_3_proc_chance', 'effect1itemtype', 'effect1Aura', 'spellTargets', 'dmg_multiplier1');
$spell_cols[2] = array('spellname', 'rank', 'levelspell', 'resistancesID', 'effect1itemtype', 'effect2itemtype', 'effect3itemtype', 'effect1BasePoints', 'effect2BasePoints', 'effect3BasePoints', 'reagent1', 'reagent2', 'reagent3', 'reagent4', 'reagent5', 'reagent6', 'reagent7', 'reagent8', 'reagentcount1', 'reagentcount2', 'reagentcount3', 'reagentcount4', 'reagentcount5', 'reagentcount6', 'reagentcount7', 'reagentcount8', 'iconname', 'effect1Aura', 'effect2Aura', 'effect3Aura');
/**
*
* @param type $base
* @return type
*/
function spell_duration($base) {
return round($base / 1000) . ' sec';
}
/**
*
* @param type $spellid
* @param type $type
* @return type
*/
function spell_desc($spellid, $type='tooltip') {
global $DB;
global $spell_cols;
global $UDWBaseconf;
$spellRow = $DB->selectRow('
SELECT ?#
FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell, '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellicons
WHERE
spellID=?
AND id=spellicon
LIMIT 1
', $spell_cols[1], $spellid
);
return spell_desc2($spellRow, $type);
}
/**
*
* @param type $spellRow
* @param string $type
* @return type
*/
function spell_desc2($spellRow, $type='tooltip') {
global $DB;
global $UDWBaseconf;
// $spellRow = $DB->selectRow('SELECT s.*, i.iconname FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell s, '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellicons i WHERE s.spellID=? AND i.id=s.spellicon LIMIT 1', $spellID);
allspellsinfo2($spellRow);
if (!IsSet($spellRow['duration_base']))
$lastduration = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellduration WHERE durationID=? LIMIT 1', $spellRow['durationID']);
$signs = array('+', '-', '/', '*', '%', '^');
$data = $spellRow[$type];
if ((!$data) and $type = 'tooltip')
return '_empty_';
$pos = 0;
$str = '';
while (false !== ($npos = strpos($data, '$', $pos))) {
if ($npos != $pos)
$str .= substr($data, $pos, $npos - $pos);
$pos = $npos + 1;
if ('$' == substr($data, $pos, 1)) {
$str .= '$';
$pos++;
continue;
}
if (!preg_match('/^((([+\-\/*])(\d+);)?(\d*)(?:([lg].*?:.*?);|(\w\d*)))/', substr($data, $pos), $result))
continue;
if (empty($exprData[0]))
$exprData[0] = 1;
$op = $result[3];
$oparg = $result[4];
$lookup = $result[5];
$var = $result[6] ? $result[6] : $result[7];
$pos += strlen($result[0]);
if (!$var)
continue;
$exprType = strtolower(substr($var, 0, 1));
$exprData = explode(':', substr($var, 1));
switch ($exprType) {
case 'r':
if (!IsSet($spellRow['rangeMax']))
$spellRow = array_merge($spellRow, $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellrange WHERE rangeID=? LIMIT 1', $spellRow['rangeID']));
$base = $spellRow['rangeMax'];
if ($op && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= $base;
break;
case 'z':
$str .= '&lt;Home&gt;';
break;
case 'c':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
$base = $spell['effect' . $exprData[0] . 'BasePoints'] + 1;
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= $base;
$lastvalue = $base;
break;
case 's':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
if (!$exprData[0])
$exprData[0] = 1;
@$base = $spell['effect' . $exprData[0] . 'BasePoints'] + 1;
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
@$str .= abs($base) . ($spell['effect' . $exprData[0] . 'DieSides'] > 1 ? ' to ' . abs(($base + $spell['effect' . $exprData[0] . 'DieSides'])) : '');
$lastvalue = $base;
break;
case 'o':
if ($lookup > 0) {
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
$lastduration = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellduration WHERE durationID=? LIMIT 1', $spell['durationID']);
}
else
$spell = $spellRow;
if (!$exprData[0])
$exprData[0] = 1;
$base = $spell['effect' . $exprData[0] . 'BasePoints'] + 1;
if ($spell['effect' . $exprData[0] . 'Amplitude'] <= 0)
$spell['effect' . $exprData[0] . 'Amplitude'] = 5000;
$str .= (($lastduration['durationBase'] / $spell['effect' . $exprData[0] . 'Amplitude']) * abs($base) . ($spell['effect' . $exprData[0] . 'DieSides'] > 1 ? '-' . abs(($base + $spell['effect' . $exprData[0] . 'DieSides'])) : ''));
break;
case 't':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
if (!$exprData[0])
$exprData[0] = 1;
$base = $spell['effect' . $exprData[0] . 'Amplitude'] / 1000;
// TODO!!
if ($base == 0)
$base = 1;
// !!TODO
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
$lastvalue = $base;
break;
case 'm':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
// TODO!!
if (!$exprData[0])
$exprData[0] = 1;
$base = $spell['effect' . $exprData[0] . 'BasePoints'] + 1;
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
$lastvalue = $base;
break;
case 'x':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
$base = $spell['effect' . $exprData[0] . 'ChainTarget'];
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
$lastvalue = $base;
break;
case 'q':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
if (!($exprData[0]))
$exprData[0] = 1;
$base = $spell['effect' . $exprData[0] . 'MiscValue'];
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
$lastvalue = $base;
break;
case 'a':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
$exprData[0] = 1; // TODO
$radius = $DB->selectCell('SELECT radiusBase FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellradius WHERE radiusID=? LIMIT 1', $spell['effect' . $exprData[0] . 'radius']);
$base = $radius;
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
break;
case 'h':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
$base = $spell['procChance'];
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
break;
case 'f':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
$base = $spell['dmg_multiplier' . $exprData[0]];
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
break;
case 'n':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
$base = $spell['procCharges'];
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
break;
case 'd':
if ($lookup > 0) {
$spell = $DB->selectRow('SELECT durationBase FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell a, '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellduration b WHERE a.durationID = b.durationID AND a.spellID=? LIMIT 1', $lookup);
@$base = ($spell['durationBase'] > 0 ? $spell['durationBase'] + 1 : 0);
}
else
$base = ($lastduration['durationBase'] > 0 ? $lastduration['durationBase'] + 1 : 0);
if ($op && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= spell_duration($base);
break;
case 'i':
$base = $spellRow['spellTargets'];
if ($op && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= $base;
break;
case 'e':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
$base = $spell['effect_' . $exprData[0] . '_proc_value'];
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= $base;
$lastvalue = $base;
break;
case 'v':
$base = $spell['affected_target_level'];
if ($op && $oparg > 0 && $base > 0) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= $base;
break;
case 'u':
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=?d LIMIT 1', $lookup);
else
$spell = $spellRow;
// $base = $spell['effect_'.$exprData[0].'_misc_value'];
if (isset($spell['effect' . $exprData[0] . 'MiscValue']))
$base = $spell['effect' . $exprData[0] . 'MiscValue'];
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
$lastvalue = $base;
break;
case 'b': // only used at one spell (14179) should be 20, column 110/111/112?)
if ($lookup > 0)
$spell = $DB->selectRow('SELECT * FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell WHERE spellID=? LIMIT 1', $lookup);
else
$spell = $spellRow;
$base = $spell['effect_' . $exprData[0] . '_proc_chance'];
if (in_array($op, $signs) && is_numeric($oparg) && is_numeric($base)) {
$equation = $base . $op . $oparg;
eval('$base = $equation;');
}
$str .= abs($base);
$lastvalue = $base;
break;
case 'l':
if ($lastvalue > 1)
$str .= $exprData[1];
else
$str .= $exprData[0];
break;
case 'g':
$str .= $exprData[0];
break;
default:
$str .= "[{$var} ($op::$oparg::$lookup::$exprData[0])]";
}
}
$str .= substr($data, $pos);
$str = @preg_replace_callback("|\{([^\}]+)\}|", create_function('$matches', 'return eval("return abs(".$matches[1].");");'), $str);
return($str);
}
/**
*
* @param type $row
* @return string
*/
function render_spell_tooltip(&$row) {
// БД
global $DB;
global $UDWBaseconf;
// Время каста
if ($row['spellcasttimesID'] > 1)
$casttime = ($DB->selectCell('SELECT base FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellcasttimes WHERE id=? LIMIT 1', $row['spellcasttimesID'])) / 1000;
// Дальность действия
$range = $DB->selectCell('SELECT rangeMax FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellrange WHERE rangeID=? LIMIT 1', $row['rangeID']);
// Реагенты
$reagents = array();
$i = 0;
for ($j = 1; $j <= 8; $j++) {
if ($row['reagent' . $j]) {
$reagents[$i] = array();
// Имя реагента
$reagents[$i]['name'] = $DB->selectCell("SELECT name FROM ?_item_template WHERE entry=? LIMIT 1", $row['reagent' . $j]);
// Количество реагентов
$reagents[$i]['count'] = $row['reagentcount' . $j];
$i++;
}
}
// Инструменты
$tools = array();
$i = 0;
for ($j = 1; $j <= 2; $j++) {
if ($row['tool' . $j]) {
$tools[$i] = array();
// Имя инструмента
$tools[$i]['name'] = $DB->selectCell("SELECT name FROM ?_item_template WHERE entry=? LIMIT 1", $row['tool' . $j]);
$i++;
}
}
// До подсказка о спелле
$desc = spell_desc2($row);
$x = '';
$x .= '<table><tr><td>';
if ($row['rank'])
$x .= '<table width="100%"><tr><td>';
$x .= '<b>' . $row['spellname'] . '</b><br />';
if ($row['rank'])
$x .= '</td><th><b class="q0">' . $row['rank'] . '</b></th></tr></table>';
if (($range) and (($row['manacost'] > 0) or ($row['manacostpercent'] > 0)))
$x .= '<table width="100%"><tr><td>';
if ($row['manacost'] > 0)
$x .= $row['manacost'] . ' mana<br />';
if ($row['manacostpercent'] > 0)
$x .= $row['manacostpercent'] . "% of base mana<br />";
if (($range) and (($row['manacost'] > 0) or ($row['manacostpercent'] > 0)))
$x .= '</td><th>';
if ($range)
$x .= $range . ' yd range<br />';
if (($range) and (($row['manacost'] > 0) or ($row['manacostpercent'] > 0)))
$x .= '</th></tr></table>';
if ((($row['ChannelInterruptFlags']) or (isset($casttime)) or ($row['spellcasttimesID'] == 1)) and ($row['cooldown']))
$x .= '<table width="100%"><tr><td>';
if ($row['ChannelInterruptFlags'])
$x .= 'Channeled';
elseif (isset($casttime))
$x .= $casttime . ' sec cast';
elseif ($row['spellcasttimesID'] == 1)
$x .= 'Instant';
if ((($row['ChannelInterruptFlags']) or (isset($casttime)) or ($row['spellcasttimesID'] == 1)) and ($row['cooldown']))
$x .= '</td><th>';
if ($row['cooldown'])
$x.= ($row['cooldown'] / 1000) . ' sec cooldown';
if ((($row['ChannelInterruptFlags']) or (isset($casttime)) or ($row['spellcasttimesID'] == 1)) and ($row['cooldown']))
$x .= '</th></tr></table>';
$x .= '</td></tr></table>';
if ($reagents) {
$x .= '<table><tr><td>';
$x .= 'Reagents: ';
foreach ($reagents as $i => $reagent) {
$x .= $reagent['name'];
if ($reagent['count'] > 1)
$x .= ' (' . $reagents[$i]['count'] . ')';
if (!($i >= (count($reagents) - 1)))
$x .= ', ';
else
$x .= '<br>';
}
$x .= '</td></tr></table>';
}
if ($tools) {
$x .= '<table><tr><td>';
$x .= 'Tools: ';
foreach ($tools as $i => $tool) {
$x .= $tool['name'];
if (!($i >= (count($tools) - 1)))
$x .= ', ';
else
$x .= '<br>';
}
$x .= '</td></tr></table>';
}
if (($desc) and ($desc != '_empty_'))
$x .= '<table><tr><td><span class="q">' . $desc . '</span></td></tr></table>';
return $x;
}
/**
*
* @param type $row
* @param type $level
* @return type
*/
function allspellsinfo2(&$row, $level=0) {
global $DB;
global $UDWBaseconf;
if (!($row['spellID']))
return;
global $allspells;
$num = $row['spellID'];
if (isset($allitems[$num]))
return $allitems[$num];
// Номер спелла
$allspells[$num]['entry'] = $row['spellID'];
// Имя иконки спелла
if (($row['effect1itemtype']) and (!($row['effect1Aura']))) {
if (IsSet($allitems[$row['effect1itemtype']]['icon']))
$allspells[$num]['icon'] = trim($allitems[$row['effect1itemtype']]['icon'], "\r");
else
$allspells[$num]['icon'] = trim($DB->selectCell('SELECT iconname FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_icons WHERE id=(SELECT displayid FROM ?_item_template WHERE entry=?d LIMIT 1) LIMIT 1', $row['effect1itemtype']) , "\r");
} else {
$allspells[$num]['icon'] = trim($row['iconname'], "\r");
}
// Тултип спелла
if ($level > 0) {
$spellNameKey = 'spellname';
$allspells[$num]['name'] = $row[$spellNameKey] ;
$allspells[$num]['info'] = render_spell_tooltip($row);
}
if ($level == 1)
return $allspells[$num];
elseif ($level == 2)
return $allspells[$num]['info'];
else
return;
}
/**
*
* @param type $row
* @return string
*/
function spell_buff_render($row) {
global $DB;
global $UDWBaseconf;
$x = '<table><tr>';
// Имя баффа
$x .= '<td><b class="q">' . $row['spellname'] . '</b></td>';
// Тип диспела
if ($row['dispeltypeID']) {
$dispel = $DB->selectCell('SELECT name' . ' FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spelldispeltype WHERE id=? LIMIT 1', $row['dispeltypeID']);
$x .= '<th><b class="q">' . $dispel . '</b></th>';
}
$x .= '</tr></table>';
// Подсказка для баффа
$x .= '<table><tr><td>';
$x .= spell_desc2($row, 'buff') . '<br>';
// Длительность баффа
$duration = $DB->selectCell('SELECT durationBase FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellduration WHERE durationID=? LIMIT 1', $row['durationID']);
if ($duration > 0)
$x .= '<span class="q">' . ($duration / 1000) . ' seconds remaining</span>';
$x .= '</td></tr></table>';
return $x;
}
/**
*
* @param type $id
* @param type $level
* @return type
*/
function allspellsinfo($id, $level=0) {
global $DB;
global $allspells;
global $spell_cols;
global $UDWBaseconf;
if (isset($allitems[$id]))
return $allitems[$id];
//TODO $UDWBaseconf['aowow']['db'];
$row = $DB->selectRow('
SELECT ?#
FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell s, '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellicons i
WHERE
s.spellID=?
AND i.id = s.spellicon
LIMIT 1
', $spell_cols[$level], $id
);
if ($row)
return allspellsinfo2($row, $level);
else
return;
}
// Подробная информация о спеле
/**
*
* @param type $id
* @return type
*/
function spellinfo($id) {
global $DB;
global $UDWBaseconf;
$row = $DB->selectRow('
SELECT s.*, i.iconname
FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_spell s, '.$UDWBaseconf['aowow']['db'].'.?_aowow_spellicons i
WHERE
s.spellID=?
AND i.id = s.spellicon
LIMIT 1
', $id
);
return spellinfo2($row);
}
/**
*
* @param type $row
* @return type
*/
function spellinfo2(&$row) {
global $DB;
global $item_cols;
global $UDWBaseconf;
if ($row) {
$spell = array();
$spell['entry'] = $row['spellID'];
$spell['quality'] = '@';
$spell['name'] = $row['spellname'];
$spell['rank'] = $row['rank'];
$spell['level'] = $row['levelspell'];
$spell['school'] = $row['resistancesID'];
// TODO: Что за cat?
$spell['cat'] = 0;
// Скилл
// if(!(isset($row['skillID'])))
// $skillrow = list($row['skillID'],$row['req_skill_value'],$row['min_value'],$row['max_value']);//$DB->selectRow('SELECT skillID, req_skill_value, min_value, max_value FROM '.$UDWBaseconf['aowow']['db'].'.?_aowow_skill_line_ability WHERE spellID=?d LIMIT 1', $spell['entry']);
if (isset($row['skillID'])) {
// if($skillrow['req_skill_value'] != 1)
// $spell['learnedat'] = $skillrow['req_skill_value'];
// TODO: На каком уровне скилла можно обучиться спеллу (поле learnedat)
if ($row['min_value'] and $row['max_value']) {
$spell['colors'] = array();
$spell['colors'][0] = '';
$spell['colors'][1] = $row['min_value'];
$spell['colors'][2] = floor(($row['max_value'] + $row['min_value']) / 2);
$spell['colors'][3] = $row['max_value'];
}
$spell['skill'] = $row['skillID'];
}
// Реагенты
$spell['reagents'] = array();
$i = 0;
global $allitems;
for ($j = 1; $j <= 8; $j++) {
if ($row['reagent' . $j]) {
$spell['reagents'][$i] = array();
// ID реагента
$spell['reagents'][$i]['entry'] = $row['reagent' . $j];
// Доп данные о реагенте
// Если данных для этой вещи ещё нет:
allitemsinfo($spell['reagents'][$i]['entry'], 0);
// Количество реагентов
$spell['reagents'][$i]['count'] = $row['reagentcount' . $j];
$i++;
}
}
// Создает вещь:
$i = 0;
for ($j = 1; $j <= 3; $j++)
if (isset($row['effect' . $j . 'id']) && $row['effect' . $j . 'id'] == 24) {
$spell['creates'][$i] = array();
$spell['creates'][$i]['entry'] = $row['effect' . $j . 'itemtype'];
$spell['creates'][$i]['count'] = $row['effect' . $j . 'BasePoints'] + 1;
if (!(isset($allitems[$spell['creates'][$i]['entry']]))) {
//TODO $UDWBaseconf['aowow']['db']
$createrow = $DB->selectRow('
SELECT ?#
FROM ?_item_template, '.$UDWBaseconf['aowow']['db'].'.?_aowow_icons
WHERE
entry=?d
AND id=displayid
LIMIT 1', $item_cols[0], $spell['creates'][$i]['entry']
);
allitemsinfo2($createrow, 0);
}
if (!(isset($allitems[$spell['creates'][$i]['entry']]))) {
// Если так и не существует - нет соответствующей записи в таблице вещей
$spell['quality'] = 6;
} else {
$spell['quality'] = 6 - $allitems[$spell['creates'][$i]['entry']]['quality'];
}
$i++;
}
allspellsinfo2($row, 0);
return $spell;
} else {
return;
}
}