Advertisement
fastman92

ReplaceCharactersToGXTequivalents & ExportGXT

Aug 24th, 2012
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.45 KB | None | 0 0
  1. <?php
  2.     // $characterMap is parsed array of characters
  3.     private function ReplaceCharactersToGXTequivalents($a, &$b, &$c)
  4.     {              
  5.         $b = '';
  6.  
  7.         $d = 0;
  8.         $e = strlen($a);
  9.  
  10.         $f = count($c);
  11.        
  12.         while($d < $e)
  13.         {      
  14.             for(
  15.                 $g = $f > $e - $d ? $e - $d : $f;
  16.                 $g >= 1;
  17.                 --$g)
  18.             {
  19.                 $j = '';
  20.  
  21.                 for($i = 0; $i < $g; ++$i)
  22.                     $j .= $a[$d+$i];
  23.                
  24.                 foreach($c[$g] as $h)
  25.                 {
  26.                     if($j === $h['from'])
  27.                     {
  28.                         $b .= $h['to'];
  29.                         $d += $g;
  30.                         continue 3;
  31.                     }
  32.                 }
  33.             }
  34.             throw new Exception('found character with no equivalent in GXT character map: '.substr($a, $d));
  35.             $b = NULL;
  36.         }    
  37.     }
  38.  
  39.     /*
  40.         Exports entries to GXT file
  41.         Versions: 'GTASA'
  42.  
  43.         Returns filesize of GXT file or FALSE on failure of writing
  44.     */
  45.     public function ExportGxtFile($langID, $gxtVersion, $filename)
  46.     {        
  47.         if($fh = fopen($filename, "wb"))
  48.         {
  49.             $LIMIT_MYSQL_ROWS = 500;
  50.             $LIMIT_FILE_BUFFER_BYTES = 4096;
  51.            
  52.             $errorMessages = '';
  53.  
  54.             if($gxtVersion == 'GTASA')
  55.             {                                            
  56.                 $TABL_SECTION_MEMBER_SIZE = 12;
  57.                 $TKEY_SECTION_MEMBER_SIZE = 8;                                              
  58.                
  59.                 $characterMap = $this -> GetLanguageCharacterMapPreparedForReplacingChars($langID);                                        
  60.  
  61.                 $TABL_SECTION = $this -> GetGxtTableNames();
  62.                 $TABL_SECTION_count = count($TABL_SECTION);
  63.                 $TABL_SECTION_blocksize = $TABL_SECTION_count * $TABL_SECTION_MEMBER_SIZE;
  64.  
  65.                 // // Header and TABL blocksize
  66.                 fwrite($fh,
  67.                     "\x4\x0\x8\x0TABL"
  68.                     .pack('Lx'.$TABL_SECTION_blocksize, $TABL_SECTION_blocksize)
  69.                     );
  70.                
  71.                 $TABL_SECTION_offset = 12;                                                                        
  72.  
  73.                 $TKEY_offset = ftell($fh);                
  74.  
  75.                 $TABL_offsets = array();
  76.  
  77.                 // /*Debug*/ $TABL_SECTION_count = 1;
  78.                 $FileBuffer = '';
  79.  
  80.                 $gxtTables = array();
  81.  
  82.                 foreach($TABL_SECTION as $tableName)
  83.                 {
  84.                     $MySQLresult = mysql_query('SELECT gxt_key, gxt_text
  85.                                            FROM `'.$this -> table_prefix.'table_'.mysql_escape_string($tableName).'`
  86.                                            WHERE lang_id = '.$langID);
  87.  
  88.                     $gxtTables[$tableName] = array();
  89.  
  90.                     while($gxtEntry = mysql_fetch_assoc($MySQLresult))
  91.                     {
  92.                         $gxtEntry['gxt_key_hash'] = GTASA_CRC32($gxtEntry['gxt_key']);
  93.  
  94.                         $gxtTables[$tableName][] = $gxtEntry;                          
  95.                     }                                                          
  96.                 }
  97.                
  98.                 foreach($gxtTables as $gxtTableName => &$gxtTableEntries)
  99.                     usort($gxtTableEntries, 'SortGxtEntriesByHash');
  100.  
  101.                 $TABL_SECTION_id = 0;
  102.                 foreach($gxtTables as $gxtTableName => &$gxtTableEntries)
  103.                 {
  104.                     $tableEntriesCount = count($gxtTableEntries);
  105.                    
  106.                     $TABL_offsets[$TABL_SECTION_id]['tkey'] = ftell($fh);
  107.  
  108.                     if($TABL_SECTION_id)
  109.                        fwrite($fh, pack('a8', $gxtTableName));                      
  110.  
  111.                     fwrite($fh, 'TKEY'.pack('L', $tableEntriesCount * $TKEY_SECTION_MEMBER_SIZE));
  112.                    
  113.                     $TABL_offsets[$TABL_SECTION_id]['tkey_array'] = ftell($fh);     // TKEY array of entries                      
  114.                                                            
  115.                     fwrite($fh, pack('x'.($tableEntriesCount * $TKEY_SECTION_MEMBER_SIZE)));
  116.                    
  117.                     // Write TDAT section
  118.                     fwrite($fh, 'TDAT');
  119.  
  120.                     $TABL_offsets[$TABL_SECTION_id]['tdat_block_size_offset'] = ftell($fh);      // TDAT block size
  121.                     fwrite($fh, pack('x4'));    // TDAT block size
  122.  
  123.                     $TABL_offsets[$TABL_SECTION_id]['tdat_array_offset'] = $TABL_offsets[$TABL_SECTION_id]['tdat_block_size_offset'] + 4;
  124.                     $FilePos = $TABL_offsets[$TABL_SECTION_id]['tdat_array_offset'];
  125.  
  126.                     foreach($gxtTableEntries as &$gxtEntry)
  127.                     {
  128.                         try {
  129.                             $this -> ReplaceCharactersToGXTequivalents($gxtEntry['gxt_text'], $gxtEntry['gxt_text'], $characterMap);
  130.                         }
  131.                         catch (Exception $e) {  
  132.                             if(!empty($errorMessages))
  133.                                 $errorMessages .= "\r\n<br/>";
  134.                                                                          
  135.                             $errorMessages .= "Table $tableName, GXT key ".$gxtEntry['gxt_key'].': '.$e -> GetMessage();
  136.                         }
  137.  
  138.                         $gxtEntry['tdat_offset'] = $FilePos - $TABL_offsets[$TABL_SECTION_id]['tdat_array_offset'];
  139.  
  140.                         $packed_gxt_text = pack('a*x', $gxtEntry['gxt_text']);
  141.  
  142.                         $FileBuffer .= $packed_gxt_text;
  143.                         $FilePos += strlen($packed_gxt_text);
  144.                        
  145.                         unset($gxtEntry['gxt_text']);
  146.  
  147.                         if(strlen($FileBuffer) > $LIMIT_FILE_BUFFER_BYTES)
  148.                         {
  149.                             fwrite($fh, $FileBuffer);
  150.                             $FileBuffer = NULL;
  151.                         }
  152.                     }                    
  153.                    
  154.                     fwrite($fh, $FileBuffer);
  155.                     $FileBuffer = NULL;
  156.  
  157.                     $TABL_offsets[$TABL_SECTION_id]['tdat_block_size_value'] = $FilePos - $TABL_offsets[$TABL_SECTION_id]['tdat_array_offset'];
  158.  
  159.                     $TABL_SECTION_id++;
  160.                 }
  161.                 $GXT_filesize = $FilePos;                            
  162.  
  163.                 // Write TDAT block sizes
  164.                 $TABL_SECTION_id = 0;
  165.                 foreach($TABL_offsets as $info)
  166.                 {
  167.                     fseek($fh, $info['tdat_block_size_offset']);
  168.                     fwrite($fh, pack('L', $info['tdat_block_size_value']));
  169.                 }
  170.                
  171.                 $TABL_SECTION_id = 0;
  172.                 foreach($gxtTables as $gxtTableName => &$gxtTableEntries)
  173.                 {
  174.                     fseek($fh, $TABL_offsets[$TABL_SECTION_id]['tkey_array']);
  175.  
  176.                     foreach ($gxtTableEntries as &$gxtEntry)
  177.                     {
  178.                         $packed = pack('LL', $gxtEntry['tdat_offset'], $gxtEntry['gxt_key_hash']);
  179.                         $FileBuffer .= $packed;
  180.  
  181.                         if(strlen($FileBuffer) > $LIMIT_FILE_BUFFER_BYTES)
  182.                         {
  183.                             fwrite($fh, $FileBuffer);
  184.                             $FileBuffer = NULL;
  185.                         }
  186.                     }
  187.  
  188.                     fwrite($fh, $FileBuffer);
  189.                     $FileBuffer = NULL;
  190.  
  191.                     $TABL_SECTION_id++;                    
  192.                 }                
  193.  
  194.                 // Write TKEY offsets in TABL
  195.                 fseek($fh, $TABL_SECTION_offset);
  196.                            
  197.                 for($i = 0; $i < $TABL_SECTION_count; $i++)
  198.                     $FileBuffer .= pack('a8L', $TABL_SECTION[$i], $TABL_offsets[$i]['tkey']);
  199.                    
  200.                  fwrite($fh, $FileBuffer);                                          
  201.             }
  202.            
  203.             fclose($fh);
  204.  
  205.             if(empty($errorMessages))
  206.                 return $GXT_filesize;
  207.             else
  208.             {
  209.                 unlink($filename);
  210.                 throw new Exception($errorMessages);
  211.             }
  212.         }              
  213.         return FALSE;
  214.     }
  215. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement