<?

include('root.php');
include('config.php');
include('db.php');
DB_Init($Options['DB_Host'],$Options['DB_User'],$Options['DB_Password'], $Options['DB_Database']);
 
echo('Mažu obsah databáze...');
flush();
DB_Query('TRUNCATE TABLE accounts');
DB_Query('TRUNCATE TABLE players');

echo("Hotovo<br>Načítám hráče...");
flush();
$AccountsDatFile = fopen($SavesDirectory.'accounts.dat', 'r');
$AccountsData = fread($AccountsDatFile, 1280000);
fclose($AccountsDatFile);

$AccountsStrFile = fopen($SavesDirectory.'accounts.str', 'r');
$AccountsStr = fread($AccountsStrFile, 650000);
fclose($AccountsStrFile);

echo("Hotovo<br>Načítám postavy...");
flush();
$PlayersFile = fopen($SavesDirectory.'players.save', 'r');
while(!feof($PlayersFile))
{
  $Row = trim(fgets($PlayersFile));
  //echo('.'.$Row.'.<br>');
  if(substr($Row, 0, 8) == '[OBJECT]')
  {
    $Row = trim(fgets($PlayersFile));
    $Player['GUID'] = substr($Row, 5);
    $Player['GUILD'] = 0;
    $Player['GUILD_RANK'] = 0;
    //echo($Player['GUID'].'<br>'); 
    $Row = trim(fgets($PlayersFile));
    $Type = substr($Row, 5);
    if($Type == 4) 
    {
      $Row = trim(fgets($PlayersFile));
      while(strlen($Row) != 0) 
      {
        //echo(strlen($Row).' '.$Player['GUID'].'-'.$Row.'<br>');
        //echo($Row);
        $RowParts = explode('=', $Row);
        if(count($RowParts)>1) $Player[$RowParts[0]] = $RowParts[1];        
        $Row = trim(fgets($PlayersFile));
      //echo($GUID.' '.$Type.'<br>');
      }
      
      $Players[$Player['GUID']] = $Player;
    } 
  }
}
//print_r($Players['0DD000000DD14E8AD']);
//print_r($Players);
fclose($PlayersFile);

function SubStrToNull($Source, $Start)
{
  $Result = substr($Source, $Start);
  $Result = substr($Result, 0 , strpos($Result, "\0"));
  return($Result);
}

function StrToLongint($Str)
{
  $Result = 0;
  for($I=0; $I<strlen($Str); $I++)
  {
    //echo(ord(substr($Str, $I, 1))*256^$I.'<br>');
    $Result = $Result + ord(substr($Str, $I, 1))*pow(256, $I);
  }
  //echo($Result.'<br>');
  return($Result);
}

function StrToHexStr($Str)
{
  $Result = '';
  for($J=0; $J<strlen($Str); $J++)
  {
    $Number = dechex(ord($Str{$J}));
    $Result = substr('00', 0, 2-strlen($Number)).$Number.$Result;
  }
  if(hexdec(substr(dechex(ord($Str{7})), 0, 1)) > 9) $Result = '0'.$Result; 
  return($Result);
}

$StartAddr = 0x24;
$UserRecordSize = 0xee;
$i = 0;
while($i < ((strlen($AccountsData)/$UserRecordSize)-1))
{
  $UserRecord = substr($AccountsData, $StartAddr + $i * $UserRecordSize);
  $User = array('LastIp' => '', 'SessionKey' => '', 'Characters' => array());
  $User['Name'] = SubStrToNull($AccountsStr, StrToLongint(substr($UserRecord, 0, 4)));
  $User['Password'] = SubStrToNull($AccountsStr, StrToLongint(substr($UserRecord, 4, 4)));
  $SessionKeyAddr = StrToLongint(substr($UserRecord, 60, 4));
  if($SessionKeyAddr) $User['SessionKey'] = SubStrToNull($AccountsStr, $SessionKeyAddr);
  $LastIpAddr = StrToLongint(substr($UserRecord, 64, 4));
  if($LastIpAddr) $User['LastIp'] = SubStrToNull($AccountsStr, $LastIpAddr);
  for($K = 0; $K<10; $K++)
  {
    $GUID = StrToHexStr(substr($UserRecord, 68+8*$K, 8));
    if($GUID != '0000000000000000') 
    { 
      $User['Characters'][] = strtoupper($GUID);      
    }    
  }   
  $User['PLevel'] = StrToLongint(substr($UserRecord, 148, 4));
  $User['Banned'] = StrToLongint(substr($UserRecord, 232, 1));
  $User['Locked'] = StrToLongint(substr($UserRecord, 233, 1));
  $User['LastAccess'] = StrToLongint(substr($UserRecord, 234, 4));
  $UserList[$User['Name']] = $User;
  $i++;
}

//echo($AccountsData[$Addr]+$AccountsData[$Addr+1]*256+$AccountsData[$Addr+2]*256*256+$AccountsData[$Addr+3]*256*256*256);

echo("Hotovo<br>Načítám guildy...");
flush();
$GuildsFile = fopen($SavesDirectory.'guilds.save', 'r');
while(!feof($GuildsFile))
{
  $Row = trim(fgets($GuildsFile));
  if($Row == '[GUILD]')
  {
    $Row = trim(fgets($GuildsFile));
    $Guild = array();
    while(strlen($Row) != 0) 
    {
      $RowParts = explode('=', $Row);
      if($RowParts[0] == 'ID') $GuildId = $RowParts[1];
      if($RowParts[0] == 'NAME') 
      {
        $Guild['NAME'] = $RowParts[1];
        DB_Select('guilds', '*', 'id='.$GuildId);
        if(DB_NumRows()>0) DB_Update('guilds', 'id='.$GuildId, array('id' => $GuildId, 'name' => $Guild['NAME']));
        else DB_Replace('guilds', array('id' => $GuildId, 'name' => $Guild['NAME']));
      } 
      if($RowParts[0] == 'MEMBER') 
      {
        $RowParts2 = explode(' ', $RowParts[1]);
        //echo(','.$RowParts2[0].',<br>');
        if(array_key_exists($RowParts2[0], $Players))
        {
          //$Guild['MEMBER'][$Players[$RowParts2[0]]['NAME']] = $RowParts2[1];
          $Players[$RowParts2[0]]['GUILD'] = $GuildId;
          $Players[$RowParts2[0]]['GUILD_RANK'] = $RowParts2[1];
        }        
      }
      $Row = trim(fgets($GuildsFile));
     //echo($GUID.' '.$Type.'<br>');
    }
    $Guilds[] = $Guild; 
  } 
}
fclose($GuildsFile);

echo("Hotovo<br>Vkládám do databáze...");
flush();
$CharacterCount = 0;
foreach($UserList as $User)
{
  DB_Insert('accounts', array('name' => $User['Name'], 'last_ip' => $User['LastIp'], 'plevel' => $User['PLevel'], 'banned' => $User['Banned'], 'locked' => $User['Locked'], 'last_access' => $User['LastAccess'], 'session_key' => $User['SessionKey']));
  DB_Query('SELECT LAST_INSERT_ID()');
  $Row = DB_Row();
  $CharacterNames = '';
  foreach($User['Characters'] as $Character)
  { 
    $Player = $Players[$Character];
    DB_Insert('players', array('name' => $Player['NAME'], 'guid' => $Player['GUID'], 'account' => $Row[0], 'guild' => 0, 'level' => $Player['LEVEL'], 'guild' => $Player['GUILD'], 'guild_rank' => $Player['GUILD_RANK']));
  }
  
  //'.gethostbyaddr($User['LastIp']).'
}

echo("Hotovo\n");

?>
