\n";
foreach ($locales as $lId)
{
User::useLocale($lId);
$enchantsOut = array();
foreach ($enchantSpells->spellList as $spl)
{
$enchant = DB::Aowow()->SelectRow('SELECT * FROM ?_itemEnchantment WHERE Id = ?d', $spl->template['effect1MiscValue']);
if (!$enchant) // 'shouldn't' happen
continue;
// slots have to be recalculated
$slot = 0;
if ($spl->template['equippedItemClass'] == 4) // armor
{
if ($invType = $spl->template['equippedItemInventoryTypeMask'])
$slot = $spl->template['equippedItemInventoryTypeMask'] >> 1;
else /* if (equippedItemSubClassMask == 64) */ // shields have it their own way <_<
$slot = (1 << (14 - 1));
}
else if ($spl->template['equippedItemClass'] == 2) // weapon
{
foreach ($slotPointer as $i => $sp)
{
if (!$sp)
continue;
if ((1 << $i) & $spl->template['equippedItemSubClassMask'])
{
if ($sp == 13) // also mainHand & offHand *siiigh*
$slot |= ((1 << (21 - 1)) | (1 << (22 - 1)));
$slot |= (1 << ($sp - 1));
}
}
}
// costy and locale-independant -> cache
if (!isset($jsonEnchants[$enchant['Id']]))
$jsonEnchants[$enchant['Id']] = Util::parseItemEnchantment($enchant);
// defaults
$ench = array(
'name' => [], // set by skill or item
'quality' => -1, // modified if item
'icon' => strToLower($spl->template['iconString']), // item over spell
'source' => [], // <0: item; >0:spell
'skill' => -1, // modified if skill
'slots' => [], // determied per spell but set per item
'enchantment' => Util::jsEscape(Util::localizedString($enchant, 'text')),
'jsonequip' => $jsonEnchants[$enchant['Id']],
'temp' => 0, // always 0
'classes' => 0, // modified by item
);
if ($enchant['skillLine'] > 0)
$ench['jsonequip']['reqskill'] = $enchant['skillLine'];
if ($enchant['skillLevel'] > 0)
$ench['jsonequip']['reqskillrank'] = $enchant['skillLevel'];
if ($enchant['requiredLevel'] > 0)
$ench['jsonequip']['reqlevel'] = $enchant['requiredLevel'];
// check if the spell has an entry in skill_line_ability -> Source:Profession
if ($skill = DB::Aowow()->SelectCell('SELECT skillId FROM ?_skill_line_ability WHERE spellId = ?d', $spl->Id))
{
$ench['name'][] = Util::jsEscape(Util::localizedString($spl->template, 'name'));
$ench['source'][] = $spl->Id;
$ench['skill'] = $skill;
$ench['slots'][] = $slot;
}
// check if this item can be cast via item -> Source:Item
if (!isset($castItems[$spl->Id]))
$castItems[$spl->Id] = new ItemList([['spellid_1', '=', $spl->Id], ['name', 'NOT LIKE', 'Scroll of Enchant%']]); // do not reuse enchantment scrolls
foreach ($castItems[$spl->Id]->itemList as $item)
{
$ench['name'][] = Util::jsEscape(Util::localizedString($item->template, 'name'));
$ench['source'][] = -$item->Id;
$ench['icon'] = strTolower($item->template['icon']);
$ench['slots'][] = $slot;
if ($item->template['Quality'] > $ench['quality'])
$ench['quality'] = $item->template['Quality'];
if ($item->template['AllowableClass'] > 0)
{
$ench['classes'] = $item->template['AllowableClass'];
$ench['jsonequip']['classes'] = $item->template['AllowableClass'];
}
if (!isset($ench['jsonequip']['reqlevel']))
if ($item->template['RequiredLevel'] > 0)
$ench['jsonequip']['reqlevel'] = $item->template['RequiredLevel'];
}
// enchant spell not in use
if (empty($ench['source']))
continue;
// everything gathered
if (isset($enchantsOut[$enchant['Id']])) // already found, append data
{
foreach ($enchantsOut[$enchant['Id']] as $k => $v)
{
if (is_array($v))
{
while ($pop = array_pop($ench[$k]))
$enchantsOut[$enchant['Id']][$k][] = $pop;
}
else
{
if ($k == 'quality') // quality:-1 if spells and items are mixed
{
if ($enchantsOut[$enchant['Id']]['source'][0] > 0 && $ench['source'][0] < 0)
$enchantsOut[$enchant['Id']][$k] = -1;
else if ($enchantsOut[$enchant['Id']]['source'][0] < 0 && $ench['source'][0] > 0)
$enchantsOut[$enchant['Id']][$k] = -1;
else
$enchantsOut[$enchant['Id']][$k] = $ench[$k];
}
else if ($enchantsOut[$enchant['Id']][$k] <= 0)
$enchantsOut[$enchant['Id']][$k] = $ench[$k];
}
}
}
else // nothing yet, create new
$enchantsOut[$enchant['Id']] = $ench;
}
// walk over each entry and strip single-item arrays
foreach ($enchantsOut as $eId => $ench)
{
foreach ($ench as $k => $v)
if (is_array($v) && count($v) == 1 && $k != 'jsonequip')
$enchantsOut[$eId][$k] = $v[0];
}
ksort($enchantsOut);
$toFile = "var g_enchants = ";
$toFile .= json_encode($enchantsOut, JSON_PRETTY_PRINT | JSON_NUMERIC_CHECK);
$toFile .= ";";
$file = 'datasets\\'.User::$localeString.'\\enchants';
$handle = fOpen($file, "w");
fWrite($handle, $toFile);
fClose($handle);
echo "done enchants loc: ".$lId." in ".Util::execTime()."
\n";
}
echo "
\nall done";
User::useLocale(LOCALE_EN);
$stats = DB::Aowow()->getStatistics();
echo "
\n".$stats['count']." queries in: ".Util::formatTime($stats['time'] * 1000);
?>