function objectinfo2(&$Row, $level = 0) { global $DB; // Номер объекта $object['entry'] = $Row['entry']; // Название объекта $object['name'] = localizedName($Row); // Тип объекта $object['type'] = $Row['type']; if ($level > 0) { // В зависимости от типа объекта, заполняем поля: switch ($object['type']) { case GAMEOBJECT_TYPE_DOOR: /* * data0: startOpen (Boolean flag) * data1: open (LockId from Lock.dbc) * data2: autoClose (long unknown flag) * data3: noDamageImmune (Boolean flag) * data4: openTextID (Unknown Text ID) * data5: closeTextID (Unknown Text ID) */ $object['lockid'] = $Row['data1']; break; case GAMEOBJECT_TYPE_BUTTON: /* * data0: startOpen (State) * data1: open (LockId from Lock.dbc) * data2: autoClose (long unknown flag) * data3: linkedTrap (gameobject_template.entry (Spawned GO type 6)) * data4: noDamageImmune (Boolean flag) * data5: large? (Boolean flag) * data6: openTextID (Unknown Text ID) * data7: closeTextID (Unknown Text ID) * data8: losOK (Boolean flag) */ $object['lockid'] = $Row['data1']; case GAMEOBJECT_TYPE_QUESTGIVER: /* * data0: open (LockId from Lock.dbc) * data1: questList (unknown ID) * data2: pageMaterial (PageTextMaterial.dbc) * data3: gossipID (unknown ID) * data4: customAnim (unknown value from 1 to 4) * data5: noDamageImmune (Boolean flag) * data6: openTextID (Unknown Text ID) * data7: losOK (Boolean flag) * data8: allowMounted (Boolean flag) * data9: large? (Boolean flag) */ $object['lockid'] = $Row['data0']; break; case GAMEOBJECT_TYPE_CHEST: /* * data0: open (LockId from Lock.dbc) * data1: chestLoot (gameobject_loot_template.entry) *This field is obtained from WDB data and is not to be changed* * data2: chestRestockTime (time in seconds) * data3: consumable (State: Boolean flag) * data4: minRestock (Min successful loot attempts for Mining, Herbalism etc) * data5: maxRestock (Max successful loot attempts for Mining, Herbalism etc) * data6: lootedEvent (unknown ID) * data7: linkedTrap (gameobject_template.entry (Spawned GO type 6)) * data8: questID (v_quest_template.entry of completed quest) * data9: level (minimal level required to open this gameobject) * data10: losOK (Boolean flag) * data11: leaveLoot (Boolean flag) * data12: notInCombat (Boolean flag) * data13: log loot (Boolean flag) * data14: openTextID (Unknown ID) * data15: use group loot rules (Boolean flag) */ $object['lockid'] = $Row['data0']; $object['lootid'] = $Row['data1']; break; case GAMEOBJECT_TYPE_BINDER: /* Object type not used */ break; case GAMEOBJECT_TYPE_GENERIC: /* * data0: floatingTooltip (Boolean flag) * data1: highlight (Boolean flag) * data2: serverOnly? (Always 0) * data3: large? (Boolean flag) * data4: floatOnWater (Boolean flag) * data5: questID (Required active v_quest_template.entry to work) */ break; case GAMEOBJECT_TYPE_TRAP: /* * data0: open (LockId from Lock.dbc) * data1: level (npc equivalent level for casted spell) * data2: radius (Distance) * data3: spell (Spell Id from spell.dbc) * data4: charges (0 or 1) * data5: cooldown (time in seconds) * data6: ? (unknown flag) * data7: startDelay? (time in seconds) * data8: serverOnly? (always 0) * data9: stealthed (Boolean flag) * data10: large? (Boolean flag) * data11: stealthAffected (Boolean flag) * data12: openTextID (Unknown ID) */ $object['lockid'] = $Row['data0']; break; case GAMEOBJECT_TYPE_CHAIR: /* * data0: chairslots (number of players that can sit down on it) * data1: chairorientation? (number of usable side?) */ break; case GAMEOBJECT_TYPE_SPELL_FOCUS: /* * data0: spellFocusType (from SpellFocusObject.dbc) * data1: radius (Distance) * data2: linkedTrap (gameobject_template.entry (Spawned GO type 6)) */ break; case GAMEOBJECT_TYPE_TEXT: /* * data0: pageID (page_text.entry) * data1: language (from Languages.dbc) * data2: pageMaterial (PageTextMaterial.dbc) */ $object['pageid'] = $Row['data0']; break; case GAMEOBJECT_TYPE_GOOBER: /* * data0: open (LockId from Lock.dbc) * data1: questID (Required active v_quest_template.entry to work) * data2: eventID (Unknown Event ID) * data3: ? (unknown flag) * data4: customAnim (unknown) * data5: consumable (Boolean flag controling if gameobject will despawn or not) * data6: cooldown (time is seconds) * data7: pageID (page_text.entry) * data8: language (from Languages.dbc) * data9: pageMaterial (PageTextMaterial.dbc) * data10: spell (Spell Id from spell.dbc) * data11: noDamageImmune (Boolean flag) * data12: linkedTrap (gameobject_template.entry (Spawned GO type 6)) * data13: large? (Boolean flag) * data14: openTextID (Unknown ID) * data15: closeTextID (Unknown ID) * data16: losOK (Boolean flag) */ $object['lockid'] = $Row['data0']; $object['pageid'] = $Row['data7']; break; case GAMEOBJECT_TYPE_TRANSPORT: /* No data data used, all are always 0 */ break; case GAMEOBJECT_TYPE_AREADAMAGE: /* Object type not used */ break; case GAMEOBJECT_TYPE_CAMERA: /* * data0: open (LockId from Lock.dbc) * data1: camera (Cinematic entry from CinematicCamera.dbc) */ $object['lockid'] = $Row['data0']; break; case GAMEOBJECT_TYPE_MAP_OBJECT: /* No data data used, all are always 0 */ break; case GAMEOBJECT_TYPE_MO_TRANSPORT: /* * data0: taxiPathID (Id from TaxiPath.dbc) * data1: moveSpeed * data2: accelRate */ break; case GAMEOBJECT_TYPE_DUEL_ARBITER: /* Only one Gameobject with this type (21680) and no data data */ break; case GAMEOBJECT_TYPE_FISHINGNODE: /* Only one Gameobject with this type (35591) and no data data */ break; case GAMEOBJECT_TYPE_RITUAL: /* * data0: casters? * data1: spell (Spell Id from spell.dbc) * data2: animSpell (Spell Id from spell.dbc) * data3: ritualPersistent (Boolean flag) * data4: casterTargetSpell (Spell Id from spell.dbc) * data5: casterTargetSpellTargets (Boolean flag) * data6: castersGrouped (Boolean flag) */ break; case GAMEOBJECT_TYPE_MAILBOX: /* No data data used, all are always 0 */ break; case GAMEOBJECT_TYPE_AUCTIONHOUSE: /* data0: actionHouseID (From AuctionHouse.dbc ?) */ break; case GAMEOBJECT_TYPE_GUARDPOST: /* Object type not used */ break; case GAMEOBJECT_TYPE_SPELLCASTER: /* * data0: spell (Spell Id from spell.dbc) * data1: charges * data2: partyOnly (Boolean flag, need to be in group to use it) */ break; case GAMEOBJECT_TYPE_MEETINGSTONE: /* * data0: minLevel * data1: maxLevel * data2: areaID (From AreaTable.dbc) */ break; case GAMEOBJECT_TYPE_FLAGSTAND: /* * data0: open (LockId from Lock.dbc) * data1: pickupSpell (Spell Id from spell.dbc) * data2: radius (distance) * data3: returnAura (Spell Id from spell.dbc) * data4: returnSpell (Spell Id from spell.dbc) * data5: noDamageImmune (Boolean flag) * data6: ? * data7: losOK (Boolean flag) */ $object['lockid'] = $Row['data0']; break; case GAMEOBJECT_TYPE_FISHINGHOLE: /* * data0: radius (distance) * data1: chestLoot (gameobject_loot_template.entry) * data2: minRestock * data3: maxRestock */ $object['lootid'] = $Row['data1']; break; case GAMEOBJECT_TYPE_FLAGDROP: /* * data0: open (LockId from Lock.dbc) * data1: eventID (Unknown Event ID) * data2: pickupSpell (Spell Id from spell.dbc) * data3: noDamageImmune (Boolean flag) */ $object['lockid'] = $Row['data0']; break; case GAMEOBJECT_TYPE_MINI_GAME: /* Object type not used Reused in core for CUSTOM_TELEPORT * data0: areatrigger_teleport.id */ break; case GAMEOBJECT_TYPE_LOTTERY_KIOSK: /* Object type not used */ break; case GAMEOBJECT_TYPE_CAPTURE_POINT: /* * data0: radius (Distance) * data1: spell (Unknown ID, not a spell id in dbc file, maybe server only side spell) * data2: worldState1 * data3: worldstate2 * data4: winEventID1 (Unknown Event ID) * data5: winEventID2 (Unknown Event ID) * data6: contestedEventID1 (Unknown Event ID) * data7: contestedEventID2 (Unknown Event ID) * data8: progressEventID1 (Unknown Event ID) * data9: progressEventID2 (Unknown Event ID) * data10: neutralEventID1 (Unknown Event ID) * data11: neutralEventID2 (Unknown Event ID) * data12: neutralPercent * data13: worldstate3 * data14: minSuperiority * data15: maxSuperiority * data16: minTime (in seconds) * data17: maxTime (in seconds) * data18: large? (Boolean flag) */ break; case GAMEOBJECT_TYPE_AURA_GENERATOR: /* * data0: startOpen (Boolean flag) * data1: radius (Distance) * data2: auraID1 (Spell Id from spell.dbc) * data3: conditionID1 (Unknown ID) */ break; case GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY: /* * data0: mapID (From Maps.dbc) * data1: difficulty (0 or 1) */ break; case GAMEOBJECT_TYPE_UNK: /* Object type not used */ break; case GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING: /* Object type not used */ break; case GAMEOBJECT_TYPE_GUILD_BANK: /* No data data used, all are always 0 */ break; } // Тип объекта и требуемый уровень скилла, и какого скилла if ($object['lockid']) { $lock_row = $DB->selectRow(' SELECT * FROM ?_lock WHERE lockID=?d LIMIT 1 ', $object['lockid']); if ($lock_row) { for ($j = 1; $j <= 5; $j++) { switch ($lock_row['type' . $j]) { case 0: // Не замок break; case 1: // Ключ $object['key'] = array(); $object['key'] = $DB->selectRow('SELECT entry as id, name, quality FROM item_template WHERE entry=?d LIMIT 1', $lock_row['lockproperties' . $j]); break; case 2: // Скилл switch ($lock_row['lockproperties' . $j]) { case LOCK_PROPERTIES_FOOTLOCK: // Сундук $object['type'] = -5; $object['lockpicking'] = $lock_row['requiredskill' . $j]; break; case LOCK_PROPERTIES_HERBALISM: // Трава $object['type'] = -3; $object['herbalism'] = $lock_row['requiredskill' . $j]; break; case LOCK_PROPERTIES_MINING: // Руда $object['type'] = -4; $object['mining'] = $lock_row['requiredskill' . $j]; break; default: break; } break; default: break; } } } } // Текст страниц if ($object['pageid']) { while ($object['pageid'] > 0) { $row = $DB->selectRow(' SELECT text, next_page {, text_loc?d} FROM page_text p {LEFT JOIN (locales_page_text l) ON l.entry = p.entry AND ?} WHERE p.entry = ?d LIMIT 1 ', $_SESSION['locale'] ? $_SESSION['locale'] : DBSIMPLE_SKIP, $_SESSION['locale'] ? 1 : DBSIMPLE_SKIP, $object['pageid']); /* if($_SESSION['locale']>0) $text = QuestReplaceStr($DB->selectCell('SELECT Text_loc?d FROM locales_page_text WHERE entry = ?d LIMIT 1', $_SESSION['locale'], $object['pageid'])); if($text) $next_page = $DB->selectCell('SELECT next_page FROM page_text WHERE entry = ?d LIMIT 1', $object['pageid']); else list($text, $next_page) = $DB->selectRow('SELECT text AS \'0\', next_page AS \'1\' FROM page_text WHERE entry = ?d LIMIT 1', $object['pageid']); */ $row['text'] = QuestReplaceStr(localizedName($row, 'text')); if (empty($row['text'])) { break; } $object['pagetext'][] = $row['text']; $object['pageid'] = $row['next_page']; } } // Лут... if (isset($object['lootid'])) { $object['drop'] = array(); if (!($object['drop'] = loot('gameobject_loot_template', $object['lootid']))) { unset($object['drop']); } } } switch ($object['type']) { case 9: $type = "Buch"; break; case 3: $type = "Behälter"; break; case 5: $type = "Schließkiste"; break; case 3: $type = "Kräuter"; break; case 4: $type = "Erzvorkommen"; break; case 2: $type = "Quest"; break; default: $type = ''; break; } $x = ''; $x .= "<table><tr><td><b class=\"q\">{$object['name']}</b></td></tr></table><table><tr><td>"; $x .= "{$type}"; $x .= "</td></tr></table>"; $object['tooltip'] = $x; return $object; }
} unset($row); unset($numRow); unset($extcost); } unset($rows_s); // Дроп if (!($npc['drop'] = loot('?_creature_loot_template', $lootid))) { unset($npc['drop']); } // Кожа if (!($npc['skinning'] = loot('?_skinning_loot_template', $lootid))) { unset($npc['skinning']); } // Воруеццо if (!($npc['pickpocketing'] = loot('?_pickpocketing_loot_template', $lootid))) { unset($npc['pickpocketing']); } // Начиниают квесты... $rows_qs = $DB->select(' SELECT ?# FROM ?_creature_questrelation c, ?_quest_template q WHERE c.id=? AND q.entry=c.quest ', $quest_cols[2], $id); if ($rows_qs) { $npc['starts'] = array(); foreach ($rows_qs as $numRow => $row) { $npc['starts'][] = GetQuestInfo($row, 0xffffff); }
AND a.id = c.refAchievement AND c.type IN (?a) AND c.value1 = ?d GROUP BY a.id ORDER BY a.name_loc?d ', $_SESSION['locale'], $_SESSION['locale'], array(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST), $quest['entry'], $_SESSION['locale']); if ($rows) { $quest['criteria_of'] = array(); foreach ($rows as $row) { allachievementsinfo2($row['id']); $quest['criteria_of'][] = achievementinfo2($row); } } // Награды и благодарности, присылаемые почтой if ($quest['RewMailTemplateId']) { if (!($quest['mailrewards'] = loot('mail_loot_template', $quest['RewMailTemplateId']))) { unset($quest['mailrewards']); } } if ($quest['RewMailDelaySecs']) { $quest['maildelay'] = sec_to_time($quest['RewMailDelaySecs']); } save_cache(QUEST_PAGE, $cache_key, $quest); } global $page; $page = array('Mapper' => false, 'Book' => false, 'Title' => $quest['Title'] . ' - ' . $smarty->get_config_vars('Quests'), 'tab' => 0, 'type' => 5, 'typeid' => $quest['entry'], 'path' => path(0, 5)); $smarty->assign('page', $page); // Комментарии $smarty->assign('comments', getcomments($page['type'], $page['typeid'])); $smarty->assign('screenshots', getscreenshots($page['type'], $page['typeid'])); // Данные о квесте
{ LEFT JOIN (?_locales_creature l) ON l.entry=c.entry AND ? } WHERE skinloot=?d AND factiontemplateID=faction_A ', $npc_cols[0], $_SESSION['locale'] > 0 ? $_SESSION['locale'] : DBSIMPLE_SKIP, $_SESSION['locale'] > 0 ? 1 : DBSIMPLE_SKIP, $lootid); foreach ($rows as $numRow => $row) { $item['skinnedfrom'][] = array_merge(creatureinfo2($row), $drop); } } unset($rows); unset($lootid); unset($drop); } unset($drops_sk); // Дизенчантитcя в: if (!($item['disenchanting'] = loot('?_disenchant_loot_template', $item['DisenchantID']))) { unset($item['disenchanting']); } // Получается дизэнчантом из.. $drops_de = drop('?_disenchant_loot_template', $item['entry']); if ($drops_de) { $item['disenchantedfrom'] = array(); foreach ($drops_de as $lootid => $drop) { $rows = $DB->select(' SELECT c.?#, c.entry, maxcount { , l.name_loc?d as `name_loc` } FROM ?_udwbase_icons, ?_item_template c { LEFT JOIN (?_locales_item l) ON l.entry=c.entry AND ? } WHERE
AND a.id = c.refAchievement AND c.type IN (?a) AND c.value1 = ?d GROUP BY a.id ORDER BY a.name_loc?d ', $_SESSION['locale'], $_SESSION['locale'], array(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST), $quest['entry'], $_SESSION['locale']); if ($rows) { $quest['criteria_of'] = array(); foreach ($rows as $row) { allachievementsinfo2($row['id']); $quest['criteria_of'][] = achievementinfo2($row); } } // Награды и благодарности, присылаемые почтой if ($quest['RewMailTemplateId']) { if (!($quest['mailrewards'] = loot('quest_mail_loot_template', $quest['entry']))) { unset($quest['mailrewards']); } } if ($quest['RewMailDelaySecs']) { $quest['maildelay'] = sec_to_time($quest['RewMailDelaySecs']); } save_cache(10, $cache_key, $quest); } global $page; $page = array('Mapper' => false, 'Book' => false, 'Title' => $quest['Title'] . ' - ' . $smarty->get_config_vars('Quests'), 'tab' => 0, 'type' => 5, 'typeid' => $quest['entry'], 'path' => path(0, 5)); $smarty->assign('page', $page); // Комментарии $smarty->assign('comments', getcomments($page['type'], $page['typeid'])); // Данные о квесте $smarty->assign('quest', $quest);
FROM ?_zones WHERE areatableID=?d LIMIT 1 ', $lootid); if ($row) { $item['fishedin'][] = array_merge($row, $drop); } } } unset($row); unset($num); } unset($drops_fi); // Размалывается в if (!($item['milling'] = loot('milling_loot_template', $item['entry']))) { unset($item['milling']); } // Получается размалыванием из $drops_mi = drop('milling_loot_template', $item['entry']); if ($drops_mi) { $item['milledfrom'] = array(); foreach ($drops_mi as $lootid => $drop) { $rows = $DB->select(' SELECT c.?#, c.entry, maxcount { , l.name_loc?d AS name_loc } FROM ?_icons, item_template c { LEFT JOIN (locales_item l) ON l.entry=c.entry AND ? } WHERE
function loot($table, $lootid, $group = 0) { global $DB, $item_cols; // Мего запрос :) $rows = $DB->select(' SELECT l.ChanceOrQuestChance, l.mincountOrRef, l.maxcount as `d-max`, l.groupid, ?#, i.entry, i.maxcount {, loc.name_loc?d AS name_loc} FROM ?# l LEFT JOIN (?_icons a, item_template i) ON l.item=i.entry AND a.id=i.displayid {LEFT JOIN (locales_item loc) ON loc.entry=i.entry AND ?d} WHERE l.entry=?d AND l.entry <> 0 { AND l.groupid = ?d } {LIMIT ?d} ', $item_cols[2], $_SESSION['locale'] ? $_SESSION['locale'] : DBSIMPLE_SKIP, $table, $_SESSION['locale'] ? 1 : DBSIMPLE_SKIP, $lootid, $group ? $group : DBSIMPLE_SKIP, $AoWoWconf['limit'] != 0 ? $AoWoWconf['limit'] : DBSIMPLE_SKIP); // Подсчитываем нужную информацию о группах $groupchance = array(); $groupzero = array(); foreach ($rows as $row) { if ($row['mincountOrRef'] >= 0) { $gid = $row['groupid']; if (!isset($groupchance[$gid])) { $groupchance[$gid] = 0; } if (!isset($groupzero[$gid])) { $groupzero[$gid] = 0; } if ($row['ChanceOrQuestChance'] == 0) { $groupzero[$gid]++; } else { $groupchance[$gid] += abs($row['ChanceOrQuestChance']); } } } // Присваиваем каждой группе номер от 1 $maxgroup = 0; $groupnum = array(); foreach ($groupchance as $id => $group) { if ($id) { $groupnum[$id] = ++$maxgroup; } else { $groupnum[$id] = ""; } } // Cохраняем весь нессылочный лут $loot = array(); foreach ($rows as $row) { if ($row['mincountOrRef'] > 0) { $chance = $row['ChanceOrQuestChance']; if ($chance == 0) { $chance = (100 - $groupchance[$row['groupid']]) / $groupzero[$row['groupid']]; if ($chance < 0) { $chance = 0; } if ($chance > 100) { $chance = 100; } } $item = $row['entry'] . '.' . $row['groupid']; // Это чтобы отделить предметы в разных группах if (isset($loot[$item])) { $loot[$item]['mincount'] = min($row['mincountOrRef'], $loot[$item]['mincount']); if ($row['groupid']) { $loot[$item]['maxcount'] = max($loot[$item]['maxcount'], $row['d-max']); } else { $loot[$item]['maxcount'] = $loot[$item]['maxcount'] + $row['d-max']; } $loot[$item]['percent'] = 1 - (1 - abs($chance)) * (1 - abs($loot[$item]['percent'])); } else { $loot[$item] = iteminfo2($row, 0); $loot[$item]['mincount'] = $row['mincountOrRef']; $loot[$item]['maxcount'] = $row['d-max']; $loot[$item]['percent'] = $chance; $loot[$item]['group'] = $groupnum[$row['groupid']]; $loot[$item]['groupcount'] = 1; } } } // И наконец, добавляем весь лут со ссылок foreach ($rows as $row) { if ($row['mincountOrRef'] < 0) { $newmax = $maxgroup; $tmploots = loot('reference_loot_template', -$row['mincountOrRef'], $row['groupid']); foreach ($tmploots as $tmploot) { if ($tmploot['group']) { $tmploot['group'] += $maxgroup; if ($newmax < $tmploot['group']) { $newmax = $tmploot['group']; } $tmploot['groupcount'] = $tmploot['groupcount'] * $row['d-max']; } else { $tmploot['maxcount'] *= $row['d-max']; } $tmploot['percent'] *= abs($row['ChanceOrQuestChance']) / 100; $loot[] = $tmploot; } $maxgroup = $newmax; } } return $loot; }
if (!isset($spell['icon'])) { $spell['icon'] = $tmpRow['iconname']; } } // Создает спелл if ($row['effect' . $j . 'triggerspell'] > 0) { $spell['effect'][$i]['spell'] = array(); $spell['effect'][$i]['spell']['entry'] = $row['effect' . $j . 'triggerspell']; $spell['effect'][$i]['spell']['name'] = $DB->selectCell('SELECT spellname_loc' . $_SESSION['locale'] . ' FROM ?_spell WHERE spellID = ?d LIMIT 1', $spell['effect'][$i]['spell']['entry']); allspellsinfo($spell['effect'][$i]['spell']['entry']); } $i++; } } // Что лутится из этого спелла (для effect_id=59 /* Open Lock Item */) if (($row['effect1id'] == 59 || $row['effect2id'] == 59 || $row['effect3id'] == 59) && !($spell['contains'] = loot('spell_loot_template', $spell['entry']))) { unset($spell['contains']); } if (!isset($spell['icon'])) { $spell['icon'] = $row['iconname']; } // Спеллы с таким же названием $seealso = $DB->select(' SELECT s.*, i.iconname FROM ?_spell s, ?_spellicons i WHERE s.spellname_loc' . $_SESSION['locale'] . ' = ? AND s.spellID <> ?d AND ( (s.effect1id = ?d AND s.effect1id!=0) OR (s.effect2id = ?d AND s.effect2id!=0)
function loot($table, $lootid, $mod = 1) { // Все элементы global $DB, $item_cols; $loot = array(); $groups = array(); // Мего запрос :) $rows = $DB->select(' SELECT l.ChanceOrQuestChance, l.mincountOrRef, l.maxcount, l.groupid, ?#, i.entry {, loc.name_loc?d AS name_loc} FROM ?# l LEFT JOIN (?_icons a, item_template i) ON l.item=i.entry AND a.id=i.displayid {LEFT JOIN (locales_item loc) ON loc.entry=i.entry AND ?d} WHERE l.entry=?d ORDER BY groupid ASC, ChanceOrQuestChance DESC {LIMIT ?d} ', $item_cols[2], $_SESSION['locale'] ? $_SESSION['locale'] : DBSIMPLE_SKIP, $table, $_SESSION['locale'] ? 1 : DBSIMPLE_SKIP, $lootid, $AoWoWconf['limit'] != 0 ? $AoWoWconf['limit'] : DBSIMPLE_SKIP); $last_group = 0; $last_group_equal_chance = 100; // Перебираем foreach ($rows as $row) { // Не группа if ($row['groupid'] == 0) { // Ссылка if ($row['mincountOrRef'] < 0) { add_loot($loot, loot('reference_loot_template', -$row['mincountOrRef'], abs($row['ChanceOrQuestChance']) / 100 * $row['maxcount'] * $mod)); } else { // Обыкновенный дроп add_loot($loot, array(array_merge(array('percent' => max(abs($row['ChanceOrQuestChance']) * $mod, 0) * sign($row['ChanceOrQuestChance']), 'mincount' => $row['mincountOrRef'], 'maxcount' => $row['maxcount']), iteminfo2($row, 0)))); } } else { $chance = abs($row['ChanceOrQuestChance']); // Новая группа? if ($row['groupid'] != $last_group) { $last_group = $row['groupid']; $last_group_equal_chance = 100; } // Шанс лута задан if ($chance > 0) { $last_group_equal_chance -= $chance; $last_group_equal_chance = max($last_group_equal_chance, 0); // Ссылка if ($row['mincountOrRef'] < 0) { add_loot($loot, loot('reference_loot_template', -$row['mincountOrRef'], $chance / 100 * $row['maxcount'] * $mod)); } else { add_loot($loot, array(array_merge(array('percent' => $chance * $mod, 'mincount' => $row['mincountOrRef'], 'maxcount' => $row['maxcount']), iteminfo2($row, 0)))); } } else { $groups[$last_group][] = array_merge(array('mincount' => $row['mincountOrRef'], 'maxcount' => $row['maxcount'], 'groupchance' => $last_group_equal_chance * $mod), iteminfo2($row, 0)); } } } // Перебираем и добавляем группы foreach ($groups as $group) { $num = count($group); foreach ($group as $item) { $item['percent'] = $item['groupchance'] / $num; add_loot($loot, array($item)); } } return $loot; }
<?php require_once 'includes/allutil.php'; require_once 'includes/allitems.php'; require_once 'includes/allcomments.php'; require_once 'includes/allscreenshots.php'; $smarty->config_load($conf_file, 'zone'); // номер объекта; $id = intval($podrazdel); $cache_key = cache_key($id); if (!($zone = load_cache(ZONE_PAGE, $cache_key))) { unset($zone); // Данные об объекте: $zone = $DB->selectRow('SELECT * FROM ?_zones WHERE areatableID = ?d', $id); $zone['name'] = localizedName($zone); if (!($zone['fishing'] = loot('fishing_loot_template', $id))) { unset($zone['fishing']); } if ($zone['parent']) { $row = $DB->selectRow('SELECT * FROM ?_zones WHERE areatableID = ?d', $zone['parent']); if ($row) { $parentname = localizedName($row); } unset($row); if (!empty($parentname)) { $zone['parentname'] = $parentname; } } $rows = $DB->select('SELECT * FROM ?_zones WHERE parent = ?d', $id); if ($rows) { $zone['subzones'] = array();