[Help] Взимане на itemset option-ите от hex ?

Pok4

Member
Joined
Feb 8, 2022
Messages
201
Reaction score
2
Здравейте,

Пореден мой въпрос към вас :)
След като оправихме Warehous-а и Expanded inventory-то, ред е на работа по предметите от функцията ItemInfo.
Искам да взема itemset option-ите от предмета, но дали е възможно ?

Ето какво имам в предвид, сега е така:
https://i.ibb.co/bFC49xD/33.png

Виждате, че е ancient, но няма Itemset option, а трябва да е така:
https://i.ibb.co/vLB5VcC/unknown-2.png

Kакъв съвет ще ми дадете, къде да ръчкам ? Мога да задам custom (мои си), но предполагам, че за всеки сет са различни и ще има много иф-ове...
Не знам дали през item hex-a е възможно да се извадят...
Не знам какво да предприема и от къде да почна.

в dmncms прегледах функциите, но те ровят из serverdata/ папката от сървъра и от там нещо се чете...
Вътре са файловете от сървъра и има item.txt,itemaddoption.txt и т.н.

Да си задам мои е решение, но много ифове (тъй като има много сетове), но дали е възможно и по-просто решение ?
 
Дай да видим функцията барем, да откраднем нещо (това в кръга на майтапа, щото ми е доста познато рендирането)?:D
 
Функцията е старичка, но преработена да работи под php 8.1 или по-нова. Има и други неща пипани, тъй като я платихме 50$.
С нея върви всичко (айтъмите от sql db, туултип и т.н.)

Ето това е познато, тъй като съм го виждал и тук из постовете:
Code:
        if ($ac > 0) {
            //$itemexl = ''; //if we uncommented this, we will hide excelent options from ancient sets
            $c = '#2FF387';// Blue -> Ancient Item
            $ancias = 'style="background:#0066CC"';
            $ancia = '#0066CC';
            $itemname = "Anc " . $itemname . "";
            if ($itemoption)
                $itemoption .= "<br>";
            $itemoption .= 'Ancient: +' . $ac . ' stamina';
            $tipche = 2;
        }

От dmn:
Code:
 public function getAncient()
        {
            if($this->ancient > 0){
                if(!in_array($this->ancient, [5,6,20])){
                    $stamina = 10;
                } else{
                    $stamina = 5;
                }
                if($this->type < 5){
                    $this->stamina = '<div class="item_light_blue item_size_12 item_font_family">' . __('Increase Strength') . ' +' . $stamina . '</div>';
                } else{
                    $this->stamina = '<div class="item_light_blue item_size_12 item_font_family">' . __('Increase Stamina') . ' +' . $stamina . '</div>';
                }
                $options = $this->ancientOptions();
                if($options != false){
                    $this->ancopt = '<div class="item_yellow">'.__('Set Item Option Info').'</div><br /><div class="item_grey">';
                    $this->ancopt .= $options . '<br />';
                    $this->ancopt .= '</div>';
                }
            }
        }

        private function ancientOptions()
        {
            $set_type = $this->serverfile->item_set_type()->get('item_set_type');
            if(is_array($set_type)){
                $this->set_options = $this->serverfile->item_set_option()->get('item_set_option');
                $this->set_options_text = $this->serverfile->item_set_option_text()->get('item_set_option_text');
                if(array_key_exists($this->type, $set_type)){
                    if(array_key_exists($this->id, $set_type[$this->type])){
                        if($this->ancient == 5 || $this->ancient == 9){
                            $set = 'typeA';
                        }
                        if($this->ancient == 6 || $this->ancient == 10){
                            $set = 'set2';
                            if($set_type[$this->type][$this->id][$set] == 0){
                                $set = 'typeA';
                            }
                        }
                        if($this->ancient == 20|| $this->ancient == 24){
                            $set = 'typeB';
                            if($set_type[$this->type][$this->id][$set] == 0){
                                $set = 'set2';
                            }
                        }
                        
                        return (isset($set)) ? $this->findAncientOption($set_type[$this->type][$this->id][$set]) : '';
                    }
                }
            }
            return false;
        }

        private function findAncientOption($set)
        {
            if(isset($this->set_options[$set])){
                $this->anc_prefix = $this->set_options[$set]['name'];
                $options = '<div class="item_light_green item_size_12 item_font_family">'.__('2Set Effect').'</div>';
                if($this->set_options[$set]['opt_1_1'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_1_1'], $this->set_options[$set]['opt_1_1_val']);
                }
                if($this->set_options[$set]['opt_2_1'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_2_1'], $this->set_options[$set]['opt_2_1_val']);
                }
                $options .= '<div class="item_light_green item_size_12 item_font_family">'.__('3Set Effect').'</div>';
                if($this->set_options[$set]['opt_1_2'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_1_2'], $this->set_options[$set]['opt_1_2_val']);
                }
                if($this->set_options[$set]['opt_2_2'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_2_2'], $this->set_options[$set]['opt_2_2_val']);
                }
                $options .= '<div class="item_light_green item_size_12 item_font_family">'.__('4Set Effect').'</div>';
                if($this->set_options[$set]['opt_1_3'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_1_3'], $this->set_options[$set]['opt_1_3_val']);
                }
                if($this->set_options[$set]['opt_2_3'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_2_3'], $this->set_options[$set]['opt_2_3_val']);
                }
                if($this->set_options[$set]['opt_1_4'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_1_4'], $this->set_options[$set]['opt_1_4_val']);
                }
                if($this->set_options[$set]['opt_2_4'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_2_4'], $this->set_options[$set]['opt_2_4_val']);
                }
                if($this->set_options[$set]['opt_1_5'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_1_5'], $this->set_options[$set]['opt_1_5_val']);
                }
                if($this->set_options[$set]['opt_2_5'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_2_5'], $this->set_options[$set]['opt_2_5_val']);
                }
                if($this->set_options[$set]['opt_1_6'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_1_6'], $this->set_options[$set]['opt_1_6_val']);
                }
                if($this->set_options[$set]['opt_2_6'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['opt_2_6'], $this->set_options[$set]['opt_2_6_val']);
                }
                if($this->set_options[$set]['fopt_1'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['fopt_1'], $this->set_options[$set]['fopt_val1']);
                }
                if($this->set_options[$set]['fopt_2'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['fopt_2'], $this->set_options[$set]['fopt_val2']);
                }
                if($this->set_options[$set]['fopt_3'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['fopt_3'], $this->set_options[$set]['fopt_val3']);
                }
                if($this->set_options[$set]['fopt_4'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['fopt_4'], $this->set_options[$set]['fopt_val4']);
                }
                if($this->set_options[$set]['fopt_5'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['fopt_5'], $this->set_options[$set]['fopt_val5']);
                }
                if($this->set_options[$set]['fopt_6'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['fopt_6'], $this->set_options[$set]['fopt_val6']);
                }
                if($this->set_options[$set]['fopt_7'] != -1){
                    $options .= $this->findAncientOptionText($this->set_options[$set]['fopt_7'], $this->set_options[$set]['fopt_val7']);
                }
            }
            return $options;
        }

        private function findAncientOptionText($index, $val)
        {
            foreach($this->set_options_text AS $key => $value){
                if($value[1] == $index){
                    $sign = '';
                    if($value[3] == 2){
                        $sign = '%';
                    }
                    return $value[2] . ' +' . $val . $sign . '<br />';
                    break;
                }
            }
        }

В DMNCMS има и кеш и е доста трудно да се извади каквото и да било от функцията. Първоначално се опитвах 2 пъти по няколко часа на ден, но нищо... Много е hardcod-нато.. Не че тази която ползваме и сега не е, но работи без кеш и се подразбира кое за какво е горе-долу...

Дайте някакви идеи, какво да правя ?
 
  • Like
Reactions: Pok4
Да, видях, благодаря. Явно без ифове няма да мине... :D
 
Съвсем без ифове няма как да стане, може ако видиш някакъв патърн (нещо, което се повтаря) да го вкараш в някакъв алгоритъм. Всеки сет има различни предмети, даже ако не ме лъже паметта един и същ може да участва в два или повече сета. Може да смениш конструкцията да не е елсеиф ами арей от итем id-та за всеки сет ама накрая пак ще е с иф,че сравнението така че.

Направи го така, че да е лесно за подръжка и дори след година след като погледнеш кода да можеш да се ориентираш. Това е моят съвет.
 
Има лек бъг и се надявам да ме насочите как да го отстраня.
Сега има сетове, които ползват еднакви рингове (Ring of poison)
item_type = 13 & item_id = 9
Единия ринг се ползва от сета Kantata, а другия от Agnis и когато съм със сета Agnis показва Kantata на ринга.
Същото се случва и с Pendant of Ice, който също се ползва от Apolo сета и още от Browii. Пак показва Apolo.
Това се случва, тъй като по-нагоре са първите сетове и от там взима явно инфо първо..

В оригиналния код се ползва item_type = 12, а при мен от моята функция ринговете са в item_type = 13 и за това съм го променил.
 
Явно спомена не ме лъже, че имаше едни и същи предмети, които участват в различни сетове. Ще показваш сет опциите само когато всички предмети от него се носят от героя. Той няма как да носи хем единия хем другия едновременно. Това, че при тебе са 13 не променя нищо. Просто когато разпознаваш сетовете, предметите се четат като цяло, в пакет. Един ако липсва няма сет, не показваш надпис сет изобщо с други думи.

Там във функцията, която ти пратих не е случайно в elseif за да са самоизключващи. Може да е само един сет в даден момент, когато всички предмети се носят.
 
Last edited:
Зависи от сета, ако говорите за ancient, има като сложиш 2 3 предмета и ти дават 1 2 3 опции
 
На сезон s6 e3 героя носи 2 - agnis и browii едновременно. Няма ли как с някоя проверка за левъл/сериал или част от item hex-a да стане?
 
Носи шлем, броня, rings и pants на Agnis и ръкавици и ботуши + pendant на Browi.
 
Еми да де какво пречи да разпознаеш 2 сета, те са независими.
 
Не мога да разбера по какъв начин да ги разпозная.. За ринговете става въпрос...
За сета е ясно, там ще взема item name-a, обаче за ринга ? То си пише и на 2-та Ring of Poison отпред няма ancient име или име на сет..
От там идва проблема. Със Serial не става - пробвах. Вади еднакви FF1A05 и на kantata и на agnis...

Мога ли да взема името на Ancient сета през hex-a и да важи и за ринг-а ?

Водя се от тук - https://forum.rage zone.com/f196/understand-hex-code-items-1-a-265194/
и май не може да се вземе, така като гледам.
Съжалявам, ако досаждам с тези глупави въпроси, но ми е важно.
Тъй като има и магазин към сайта и там може да се качват такива Ancient предмети и там се работи само с хекс... Така, че ако не го оправя тук, няма да важи и за там... Което ще е много лошо..
 
Ако се водиш от това което си показал те са ти написали къде да гледаш в хекса 17-18 или $anc = hexdec(substr($_item,16,2)); // Item Ancient.

Сериала няма нищо общо. Името на анциента не можеш от хекса да си го вземеш, хекса не съдържа ascii затова се разписва в уеб сайтовете на ръка кое какво е според хекса. Записва се в базата името на предмета (основното име) според итем-ид-тайп и допълнително се разписва дали е сет дали е анциент според хекса..

Ето от функцията:
PHP:
    if ($anc > 0){
        $image_tip = 1;
        switch ($anc){
            case 4:$itemanc ='</br><font color=#bfbfff>Ancient Item +5 stamina</font>';break;
            case 9:$itemanc ='</br><font color=#bfbfff>Ancient Item +10 stamina</font>';break;                               
        }

Ако имаш стойност 04 това е 5 стамина, ако е 09 е 10 ако е 00 не е анциент.
 
Last edited:
Нищо не може да се вземе от там. Вади ми на рингoвете числото 6 и 5 и на другите предмети от сета също се изобразява 6 и 5 при var_dump.

Да разбирам, че няма шанс да се оправи това нещо ?
Aко да, мога да премахна просто ринговете и pendant-a и ще си седят без set инфо-то... Така ще е най-добре май...
 
Много зависи как ти чете хекса, може да го конвертира в децимал функцуята или да е бинари, или да прави някакви други калкулации и да те бърка.

За да не правиш неща на сляпо, си пусни един едитор, добави си нормален предмет, сложи му стамина и виж кое ще се промени в хекса.. Едитора ще ти покаже. После чак пристъпваш към писане на функции, след като си анализирал.
 
Ми то така като гледам wiki-то, което даде и 2-та ринга са с по 10 стамина, дори и от там нищо не може да се направи.
Аз имам едитор, който върви със сървърните файлове и е с хекс рийдър + сериал (показва всичко)
Видях за какво иде реч, но няма май как да се направи... Ще премахна ринговете и амулетите, пък в шопа ако някой има интерес, да пита ингейм който продава или във форума и ние ще му казваме какво и що.. по айтъм хекса..
 
Ти искаш рингове с едини и същи опции и параметри да се казват по различен начин ли? Ако е така няма как да стане. На предметите в сет се променя името когато са в комбинация с всичките от същият сет. Дефакто търсиш в на героя инвентара всичките, а не един от тях примерно ринг оф пойсън. Когато са всичките и са анциент, това е сет тогава променяш името по усмотрение на всеки един от тях. Ако се махне единият от предметите в героя, вече са нормални анциенти, не е сет и махаш името сет, остава само анциент.
 
Aми, поне мислех, че 2-та ринга от kantata и agnis са с различна стамина, поне това можеше да е нещо с което да се захвана, но уви...
Както и да е благодаря за отговорите... Премахнах повтарящите се рингове и амулети и ще остане така...