public function initSubItems() { if (!array_keys($this->templates)) { return; } $subItemIds = []; foreach ($this->iterate() as $__) { if ($_ = $this->getField('randomEnchant')) { $subItemIds[abs($_)] = $_; } } if (!$subItemIds) { return; } // remember: id < 0: randomSuffix; id > 0: randomProperty $subItemTpls = DB::World()->select(' SELECT CAST( entry as SIGNED) AS ARRAY_KEY, CAST( ench as SIGNED) AS ARRAY_KEY2, chance FROM item_enchantment_template WHERE entry IN (?a) UNION SELECT CAST(-entry as SIGNED) AS ARRAY_KEY, CAST(-ench as SIGNED) AS ARRAY_KEY2, chance FROM item_enchantment_template WHERE entry IN (?a)', array_keys(array_filter($subItemIds, function ($v) { return $v > 0; })) ?: [0], array_keys(array_filter($subItemIds, function ($v) { return $v < 0; })) ?: [0]); $randIds = []; foreach ($subItemTpls as $tpl) { $randIds = array_merge($randIds, array_keys($tpl)); } if (!$randIds) { return; } $randEnchants = DB::Aowow()->select('SELECT *, id AS ARRAY_KEY FROM ?_itemrandomenchant WHERE id IN (?a)', $randIds); $enchIds = array_unique(array_merge(array_column($randEnchants, 'enchantId1'), array_column($randEnchants, 'enchantId2'), array_column($randEnchants, 'enchantId3'), array_column($randEnchants, 'enchantId4'), array_column($randEnchants, 'enchantId5'))); $enchants = new EnchantmentList(array(['id', $enchIds], CFG_SQL_LIMIT_NONE)); foreach ($enchants->iterate() as $eId => $_) { $this->rndEnchIds[$eId] = array('text' => $enchants->getField('name', true), 'stats' => $enchants->getStatGain()); } foreach ($this->iterate() as $mstItem => $__) { if (!$this->getField('randomEnchant')) { continue; } if (empty($subItemTpls[$this->getField('randomEnchant')])) { continue; } foreach ($subItemTpls[$this->getField('randomEnchant')] as $subId => $data) { if (empty($randEnchants[$subId])) { continue; } $data = array_merge($randEnchants[$subId], $data); $jsonEquip = []; $jsonText = []; for ($i = 1; $i < 6; $i++) { $enchId = $data['enchantId' . $i]; if ($enchId <= 0 || empty($this->rndEnchIds[$enchId])) { continue; } if ($data['allocationPct' . $i] > 0) { $qty = intVal($data['allocationPct' . $i] * $this->generateEnchSuffixFactor()); $stats = array_fill_keys(array_keys($this->rndEnchIds[$enchId]['stats']), $qty); $jsonText[$enchId] = str_replace('$i', $qty, $this->rndEnchIds[$enchId]['text']); Util::arraySumByKey($jsonEquip, $stats); } else { $jsonText[$enchId] = $this->rndEnchIds[$enchId]['text']; Util::arraySumByKey($jsonEquip, $this->rndEnchIds[$enchId]['stats']); } } $this->subItems[$mstItem][$subId] = array('name' => Util::localizedString($data, 'name'), 'enchantment' => $jsonText, 'jsonequip' => $jsonEquip, 'chance' => $data['chance']); } if (!empty($this->subItems[$mstItem])) { $this->json[$mstItem]['subitems'] = $this->subItems[$mstItem]; } } }
private static function getSubjects() { foreach (self::$subjCache as $type => $ids) { $_ = array_filter(array_keys($ids), 'is_numeric'); if (!$_) { continue; } $cnd = [CFG_SQL_LIMIT_NONE, ['id', $_]]; switch ($type) { case TYPE_NPC: $obj = new CreatureList($cnd); break; case TYPE_OBJECT: $obj = new GameobjectList($cnd); break; case TYPE_ITEM: $obj = new ItemList($cnd); break; case TYPE_ITEMSET: $obj = new ItemsetList($cnd); break; case TYPE_QUEST: $obj = new QuestList($cnd); break; case TYPE_SPELL: $obj = new SpellList($cnd); break; case TYPE_ZONE: $obj = new ZoneList($cnd); break; case TYPE_FACTION: $obj = new FactionList($cnd); break; case TYPE_PET: $obj = new PetList($cnd); break; case TYPE_ACHIEVEMENT: $obj = new AchievementList($cnd); break; case TYPE_TITLE: $obj = new TitleList($cnd); break; case TYPE_WORLDEVENT: $obj = new WorldEventList($cnd); break; case TYPE_CLASS: $obj = new CharClassList($cnd); break; case TYPE_RACE: $obj = new CharRaceList($cnd); break; case TYPE_SKILL: $obj = new SkillList($cnd); break; case TYPE_CURRENCY: $obj = new CurrencyList($cnd); break; case TYPE_EMOTE: $obj = new EmoteList($cnd); break; case TYPE_ENCHANTMENT: $obj = new EnchantmentList($cnd); break; default: continue; } foreach ($obj->iterate() as $id => $__) { self::$subjCache[$type][$id] = $obj->getField('name', true); } } }