Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Konwerter SQL->XML/XML->SQL do nowego unpackera


Rekomendowane odpowiedzi

Opublikowano

Skrypt mojego autorstwa, jak było coś podobnego to usunąć (;

 

V 0.1

<?php
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

    $mysqli = new mysqli("localhost", "user", "password", "player");    
    if ($mysqli->connect_error) {
        die("a passy dobre żeś podał?");
    }
    $handle = 'item_proto.xml';
    exec('echo '' > '.$handle.' && chmod 777 '.$handle);
    
    $i = 0;
    file_put_contents($handle, "<ItemProto Version=\"1\">\n", FILE_APPEND | LOCK_EX);
    while(true){
        $andrw = $mysqli->query("SELECT * from `player`.`item_proto` WHERE `vnum`={$i};");
        $data = $andrw->fetch_array();
        if($data){
            $converted = "<ItemDef Vnum=\"{$data['vnum']}\" Name=\"{$data['vnum']}\" LocalizedName=\"{$data['locale_name']}\" Type=\"{$data['type']}\" SubType=\"{$data['subtype']}\" Weight=\"{$data['weight']}\" Size=\"{$data['size']}\" AntiFlags=\"{$data['antiflag']}\" Flags=\"{$data['flag']}\" WearFlags=\"{$data['wearflag']}\" ImmuneFlags=\"{$data['immuneflag']}\" Gold=\"{$data['gold']}\" ShopBuyPrice=\"{$data['shop_buy_price']}\" LimitType0=\"{$data['limittype0']}\" LimitValue0=\"{$data['limitvalue0']}\" LimitType1=\"{$data['limittype1']}\" LimitValue1=\"{$data['limitvalue1']}\" ApplyType0=\"{$data['applytype0']}\" ApplyValue0=\"{$data['applyvalue0']}\" ApplyType1=\"{$data['applytype1']}\" ApplyValue1=\"{$data['applyvalue2']}\" ApplyType2=\"{$data['applytype2']}\" ApplyValue2=\"{$data['applyvalue2']}\" Value0=\"{$data['value0']}\" Value1=\"{$data['value1']}\" Value2=\"{$data['value2']}\" Value3=\"{$data['value3']}\" Value4=\"{$data['value4']}\" Value5=\"{$data['value5']}\" Socket0=\"{$data['socket0']}\" Socket1=\"{$data['socket1']}\" Socket2=\"{$data['socket2']}\" RefinedVnum=\"{$data['refined_vnum']}\" RefineSet=\"{$data['refine_set']}\" AlterToMagicItemPercent=\"{$data['magic_pct']}\" Specular=\"{$data['specular']}\" GainSocketPercent=\"{$data['socket_pct']}\" AddonType=\"{$data['addon_type']}\"    />\n";
            file_put_contents($handle, $converted, FILE_APPEND | LOCK_EX);
        }
        $i++;
        if($i == 100000)
            break;
    }
    file_put_contents($handle, "</ItemProto>", FILE_APPEND | LOCK_EX);
    echo 'item_proto w pełnej gotowości panie kapitanie!';

 

 

V 0.2

 

 

<?php
    header('Content-Type: text/html; charset=utf-8');
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

    $mysqli = new mysqli("localhost", "user", "passwd", "player");    
    if ($mysqli->connect_error) {
        die("a passy dobre żeś podał?");
    }
    $handle = 'item_proto.xml';
    exec('echo \'\' > '.$handle.' && chmod 777 '.$handle);
    
    file_put_contents($handle, "<ItemProto Version=\"1\">\n", FILE_APPEND | LOCK_EX);
    $andrw = $mysqli->query("SELECT * from `player`.`item_proto`");
        while($data = $andrw->fetch_array()){
            $converted = "<ItemDef Vnum=\"{$data['vnum']}\" Name=\"{$data['vnum']}\" LocalizedName=\"{$data['locale_name']}\" Type=\"{$data['type']}\" SubType=\"{$data['subtype']}\" Weight=\"{$data['weight']}\" Size=\"{$data['size']}\" AntiFlags=\"{$data['antiflag']}\" Flags=\"{$data['flag']}\" WearFlags=\"{$data['wearflag']}\" ImmuneFlags=\"{$data['immuneflag']}\" Gold=\"{$data['gold']}\" ShopBuyPrice=\"{$data['shop_buy_price']}\" LimitType0=\"{$data['limittype0']}\" LimitValue0=\"{$data['limitvalue0']}\" LimitType1=\"{$data['limittype1']}\" LimitValue1=\"{$data['limitvalue1']}\" ApplyType0=\"{$data['applytype0']}\" ApplyValue0=\"{$data['applyvalue0']}\" ApplyType1=\"{$data['applytype1']}\" ApplyValue1=\"{$data['applyvalue2']}\" ApplyType2=\"{$data['applytype2']}\" ApplyValue2=\"{$data['applyvalue2']}\" Value0=\"{$data['value0']}\" Value1=\"{$data['value1']}\" Value2=\"{$data['value2']}\" Value3=\"{$data['value3']}\" Value4=\"{$data['value4']}\" Value5=\"{$data['value5']}\" Socket0=\"{$data['socket0']}\" Socket1=\"{$data['socket1']}\" Socket2=\"{$data['socket2']}\" RefinedVnum=\"{$data['refined_vnum']}\" RefineSet=\"{$data['refine_set']}\" AlterToMagicItemPercent=\"{$data['magic_pct']}\" Specular=\"{$data['specular']}\" GainSocketPercent=\"{$data['socket_pct']}\" AddonType=\"{$data['addon_type']}\"    />\n";
            file_put_contents($handle, $converted, FILE_APPEND | LOCK_EX);
        }
    file_put_contents($handle, "</ItemProto>", FILE_APPEND | LOCK_EX);
    echo 'item_proto w pełnej gotowości panie kapitanie!';

 

 

Changelog:

V 0.2:

- bez kombinowania z iteratorem, chodzi szybciej i lepiej

 

 

 

XML->SQL

 

<?php
    header('Content-Type: text/html; charset=utf-8');
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

    $handle = 'item_proto.sql';
    exec('echo \'\' > '.$handle.' && chmod 777 '.$handle);
    
    $file = fopen("item_proto.xml", "r");
    if(!$file){
        die("Chyba masz zaniki pamięci... a plik dałeś?");
    }
    
    
    while($line = fgets($file)){
        if(strpos($line, "ItemProto"))
            continue;
            
        $line = explode("\" ", $line);    
        $insert = Array();
        foreach($line as $lineExploded){
            $lineExploded = substr($lineExploded, strpos($lineExploded, "\"") + 1);
            $insert[] = $lineExploded;
        }
        
        $set = Array("vnum", "name", "locale_name", "type", "subtype", "weight", "size", "antiflag", "flag", "wearflag", "immuneflag", "gold", "shop_buy_price", "limittype0", "limitvalue0", "limittype1", "limitvalue1", "applytype0", "applyvalue0", "applytype1", "applyvalue1", "applytype2", "applyvalue2", "value0", "value1", "value2", "value3", "value4", "value5", "socket0", "socket1", "socket2", "refined_vnum", "refine_set", "magic_pct","specular", "socket_pct", "addon_type");
        $values = "SET ";
        for($i = 0; $i < count($insert); $i++){
            if(count($insert) - 1 == $i){
                $values .= '`'.$set[$i].'`=\''.substr($insert[$i], 0, 1).'\';';
            } else {
                $values .= '`'.$set[$i].'`=\''.$insert[$i].'\', ';;
            }
        }
        
        file_put_contents($handle, "INSERT INTO `player`.`item_proto` {$values} \n", FILE_APPEND | LOCK_EX);
    }

    echo 'item_proto.sql w pełnej gotowości panie kapitanie!';

 

 

YhNvaXz.png

Opublikowano

Nie powiem, sam się zastanawiałem jak takie coś napisać a tu proszę - dobra robota, jakościowo też skrypt jest okej, tylko zastanawia mnie czemu pętla się kończy przy 100k wpisach.

Opublikowano

Pętla się iteruje po zmiennej i, jak wiemy są vnumy niepokolei, nie których nie ma, a niektóre są, gdy mysql rzuca query z vnum, którego nie ma:

 

while($andrw = $mysqli->query("SELECT * from `player`.`item_proto` WHERE `vnum`={$i};")
to kod się przerywa w momencie, w którym nie było vnuma o które zapytałem, dlatego by nie skonwertował całego item_proto, dlatego ustawiłem pułap 100k, żeby calutkie item_proto się skonwertowało, a rzadko kiedy są ID większe niż 100k, nawet chyba nie mogą być, ale co za problem zmienić breakpoint?

YhNvaXz.png

Opublikowano

Pliku .php nie trzeba domykać, nawet taki tip Ci sprzedam, że jak go nie domkniesz to ładuje się odrobinę szybciej ;>

YhNvaXz.png

Opublikowano

Miałem chwilkę wolnego czasu, dopisałem konwerter z XML->SQL, wiem, kwerendy mogłyby być trochę szybsze, ale są jakie są, po prostu tak mi było łatwiej, a nie miałem chęci do sprawdzania każdego elementu tablicy czy jest intem czy nie (;

<?php
    header('Content-Type: text/html; charset=utf-8');
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);

    $handle = 'item_proto.sql';
    exec('echo \'\' > '.$handle.' && chmod 777 '.$handle);
    
    $file = fopen("item_proto.xml", "r");
    if(!$file){
        die("Chyba masz zaniki pamięci... a plik dałeś?");
    }
    
    
    while($line = fgets($file)){
        if(strpos($line, "ItemProto"))
            continue;
            
        $line = explode("\" ", $line);    
        $insert = Array();
        foreach($line as $lineExploded){
            $lineExploded = substr($lineExploded, strpos($lineExploded, "\"") + 1);
            $insert[] = $lineExploded;
        }
        
        $set = Array("vnum", "name", "locale_name", "type", "subtype", "weight", "size", "antiflag", "flag", "wearflag", "immuneflag", "gold", "shop_buy_price", "limittype0", "limitvalue0", "limittype1", "limitvalue1", "applytype0", "applyvalue0", "applytype1", "applyvalue1", "applytype2", "applyvalue2", "value0", "value1", "value2", "value3", "value4", "value5", "socket0", "socket1", "socket2", "refined_vnum", "refine_set", "magic_pct","specular", "socket_pct", "addon_type");
        $values = "SET ";
        for($i = 0; $i < count($insert); $i++){
            if(count($insert) - 1 == $i){
                $values .= '`'.$set[$i].'`=\''.substr($insert[$i], 0, 1).'\';';
            } else {
                $values .= '`'.$set[$i].'`=\''.$insert[$i].'\', ';;
            }
        }
        
        file_put_contents($handle, "INSERT INTO `player`.`item_proto` {$values} \n", FILE_APPEND | LOCK_EX);
    }

    echo 'item_proto.sql w pełnej gotowości panie kapitanie!';

// EDIT, poprawiona wersja

YhNvaXz.png

Opublikowano

Tyle lat wykorzystuję do tego Navicat, który wykonuje taką robotę w dosłownie 2.312s przy 5381 rekordach i chyba nigdy nie zwróciło mi błędu.

Opublikowano

Tyle lat wykorzystuję do tego Navicat, który wykonuje taką robotę w dosłownie 2.312s przy 5381 rekordach i chyba nigdy nie zwróciło mi błędu.

LOL Koks :D

 

@topic: Skrypt dobry, świetne wykonanie...

Opublikowano

Jeśli do konwertowania item_proto używasz navicata, to jesteś moim bogiem, naucz mnie tego, proszę :D

 

ZzL5mqk.png

760671406646279502825.jpg

 

 

UpBSGLK.gif

 

Opublikowano

możliwe, że Ci to dumpuje w dobry sposób, bo mój Navicat robi to w sposób raczej nieczytelny, dla każdego packera item_proto jaki widziałem, albo za mało rzeczy jeszcze widziałem, albo mam zbyt nowoczesną wersje navicata, jeśli Tobie rzeczywiście to działa, to zwracam honor i daje Ci limit lajków mój mentorze ;<

 

 

 

RGkmcAf.png

 

 

YhNvaXz.png

Opublikowano

możliwe, że Ci to dumpuje w dobry sposób, bo mój Navicat robi to w sposób raczej nieczytelny, dla każdego packera item_proto jaki widziałem, albo za mało rzeczy jeszcze widziałem, albo mam zbyt nowoczesną wersje navicata, jeśli Tobie rzeczywiście to działa, to zwracam honor i daje Ci limit lajków mój mentorze ;<

 

 

 

6115614066550821193722.png

 

 

Trzeba kilka rzeczy tam dobrze pozaznaczać i zapomniałem o tym, że po dumpie należy zmienić pierwszą i ostatnią linię, by była kompatybilna z packerem

dzDFy2O.jpg

 

oraz <RECORD vnum=" na <Item vnum=" (całość zajmuje średnio 15 sek).

 

Czyli:

<?xml version="1.0" standalone="yes"?>
<RECORDS>
<RECORD vnum="10" hashName="µµ+0" name="Miecz+0" type="1" subtype="0" weight="0" size="2" antiflag="32" flag="1" wearflag="16" immuneflag="" gold="1000" buy_price="100" limittype0="1" limitvalue0="0" limittype1="0" limitvalue1="0" applytype0="7" applyvalue0="22" applytype1="0" applyvalue1="0" applytype2="0" applyvalue2="0" value0="0" value1="15" value2="19" value3="13" value4="15" value5="0" socket0="-1" socket1="-1" socket2="-1" socket3="-1" socket4="-1" socket5="-1" refine_vnum="11" refine_set="1" magic_pct="15" specular="0" socket_pct="1"/>
</RECORDS>

na:

<item_proto extended="true" version="1">
	<Item vnum="10" hashName="µµ+0" name="Miecz+0" type="1" subtype="0" weight="0" size="2" antiflag="32" flag="1" wearflag="16" immuneflag="" gold="1000" buy_price="100" limittype0="1" limitvalue0="0" limittype1="0" limitvalue1="0" applytype0="7" applyvalue0="22" applytype1="0" applyvalue1="0" applytype2="0" applyvalue2="0" value0="0" value1="15" value2="19" value3="13" value4="15" value5="0" socket0="-1" socket1="-1" socket2="-1" socket3="-1" socket4="-1" socket5="-1" refine_vnum="11" refine_set="1" magic_pct="15" specular="0" socket_pct="1"/>
</item_proto>

To stary, ale niezawodny sposób, a skoro działa to nie chce mi się bawić w jakieś skrypty. Nie mówię, że teraz są gorsze sposoby, lecz w 2010 był to najlepszy i najszybszy sposób dający idealnie poprawne dane, a ja się do niego przyzwyczaiłem. :)

Opublikowano

@Inkscape

Nowy packer (dump_proto) nie obsługuję .iksemelek, trzeba niestety bawić się z .txt, ale konwersja .sql -> .txt to nie problem :)

@topic

Bardzo przydatne! Dobra robota ;)

Ja nadal lecę na XML. :P

 

Kolego Inscape , wiesz co jak pierwszy raz przeczytałem twoją odpowiedź bez dodania ,że trzeba zaznaczyć opcje trochę się śmiałem ,ale przy większej ilości przedmiotów np. 200/300 jest ta funkcja mało przydatna zmiany i ucinanie kodu

Dla Notepad++ to praktycznie bez różnicy ile jest rekordów w pliku. 5k zmienia w przeciągu sekundy.  Gotowy XML powstaje w powiedzmy 40 sekund. Skrypt PHP zapewne przemuli to szybciej, ale tak jak pisałem jest to stary trick jeszcze z 2010 roku, gdzie większość ludzi ręcznie dodawało rekordy po stronie mysql i xml w cliencie uważając, by nie popełnić błędu.

Opublikowano

Bardzo dobra robota , skrypt bardzo przydatny , skrócony przejżysty kod , nic tylko polecić znajomym :)

 

Kolego Inscape , wiesz co jak pierwszy raz przeczytałem twoją odpowiedź bez dodania ,że trzeba zaznaczyć opcje trochę się śmiałem ,ale przy większej ilości przedmiotów np. 200/300 jest ta funkcja mało przydatna zmiany i ucinanie kodu

393.jpg

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...