Pastebin

The pastebin is a database of snippets. Snippets are actually small bits of code, in this case they can also be whole files though. For it’s highlighting, this pastebin uses Geshi.

Latest snippets

Class: GearScore Calculator
by Anaxent on Mon Nov 01, 2010 8:03 pm

Class: GearScore Calculator

This class calculates an identical GearScore to in-game

Snippet body:
  1. <?php
  2.  
  3. /**
  4. * Elad Nava
  5. * GearScore Calculator
  6. *
  7. * @author         $Author: Elad Nava $
  8. * @copyright    (c) 2010 Elad Nava
  9. * @link                http://invisionize.com
  10. * @version        1.0.0
  11. * @desc            This is my personal GearScore Calculator class,
  12. *                        I created it specifically for one of my IPB3 applications,
  13. *                        but I believe it could be used in other ways as well.
  14. *
  15. *                        This class calculates an identical GearScore to that of the in-game addon,
  16. *                        "GearScore". An example of this class in use is Wtfismygearscore.com.
  17. *
  18. *                        I am not affiliated in any way with the author of the in-game addon "GearScore".
  19. */
  20.  
  21. /*
  22. ========= Example Usage =========
  23.  
  24. <?php
  25.  
  26.     //--------------------------------
  27.     // Initiate GearScore Class
  28.     //--------------------------------
  29.  
  30.     if ( ! class_exists( 'GearScore' ) )
  31.     {
  32.         require_once( 'GearScore.php' );
  33.     }
  34.    
  35.     $GearScore = new GearScore();
  36.    
  37.     //--------------------------------------
  38.     // Fill in the variables
  39.     //--------------------------------------
  40.    
  41.     $region        = "";                         // Game region. E.g. "US", "EU", "KR", "CN", "TW"
  42.     $realm        = "";                        // Character's realm name. E.g. "Lightning's Blade", "Aerie Peak"
  43.     $character = "";                        // Character's in-game name. E.g. "Chromie"
  44.    
  45.     $score = $GearScore->getCharacterScore( $character, $realm, $region );
  46.    
  47.     // $score now contains the character's current GearScore
  48.     // The actual items calculated are the ones from last log off,
  49.     // This is when the armory updates the character's items.
  50.  
  51. ?>
  52.  
  53. */
  54.  
  55. class GearScore
  56. {
  57.     protected $slotMod     = array();
  58.     protected $gsFormula     = array();
  59.  
  60.     public function __construct()
  61.     {
  62.         $this->gsFormula = array(
  63.        
  64.                                             // 0 is used for iLevel < 120
  65.                                            
  66.                                             0         => array(
  67.                                                                     2 => array( 73.0000, 1.0000 ),
  68.                                                                     3 => array( 81.3750, 0.8125 ),
  69.                                                                     4 => array( 91.4500, 0.6500 ),
  70.                                                                 ),
  71.                                            
  72.                                             // 1 is used for iLevel >= 120
  73.                                            
  74.                                             1    => array(
  75.                                                                     1 => array( 0.0000, 2.2500 ),
  76.                                                                     2 => array( 8.0000, 2.0000 ),
  77.                                                                     3 => array( 0.7500, 1.8000 ),
  78.                                                                     4 => array( 26.000, 1.2000 ),
  79.                                                                 )
  80.                                          );   
  81.                                          
  82.         //----------------------------------------
  83.         // slotMod nerfs itemScore by slot
  84.         //
  85.         // 100 is used for Two-Handers
  86.         //----------------------------------------
  87.                                        
  88.         $this->slotMod = array(
  89.                                             1         => 1.0000,
  90.                                             2         => 0.5625,
  91.                                             3         => 0.7500,
  92.                                             5         => 1.0000,
  93.                                             6         => 0.7500,
  94.                                             7         => 1.0000,
  95.                                             8         => 0.7500,
  96.                                             9         => 0.5625,
  97.                                             10        => 0.7500,
  98.                                             11        => 0.5625,
  99.                                             12        => 0.5625,
  100.                                             13        => 0.5625,
  101.                                             14        => 0.5625,
  102.                                             15        => 0.5625,
  103.                                             16     => 1.0000,
  104.                                             17        => 1.0000,
  105.                                             18        => 0.3164,
  106.                                             100    => 2.0000,
  107.                                         );
  108.     }
  109.    
  110.     public function getCharacterScore( $character, $realm, $region = "US" )
  111.     {
  112.         //--------------------------------
  113.         // Get character from Armory
  114.         //--------------------------------
  115.        
  116.         $armoryXML = $this->getCharacterSheet( $character, $realm, $region );
  117.        
  118.         //--------------------------------
  119.         // "Server Busy?"
  120.         //--------------------------------
  121.        
  122.         if ( ! isset( $armoryXML->characterInfo ) )
  123.         {
  124.             $this->fatalError( "There was a problem fetching the character data from the Armory. It is possible that your server has been temporarily suspended if you have made numerous requests in a short amount of time." );
  125.         }
  126.        
  127.         //--------------------------------
  128.         // Set-up $character array
  129.         //--------------------------------
  130.        
  131.         $character = array(
  132.                                     'items'    => array(),
  133.                                     'class'    => (string)$armoryXML->characterInfo->character['classId']
  134.                                   );
  135.        
  136.         //--------------------------------
  137.         // Loop over character items
  138.         //--------------------------------
  139.        
  140.         foreach ( $armoryXML->characterInfo->characterTab->items->item as $item )
  141.         {
  142.             //------------------------------------
  143.             // Increment slot for compliance
  144.             // with InventorySlotId (ingame)
  145.             //------------------------------------
  146.            
  147.             $slot = ( (string)$item['slot'] + 1 );
  148.            
  149.             $character['items'][ $slot ] = array(
  150.                                                                 'slot'            => $slot,
  151.                                                                 'level'        => (string)$item['level'],
  152.                                                                 'rarity'        => (string)$item['rarity'],
  153.                                                             );
  154.         }
  155.        
  156.         //--------------------------------
  157.         // Calculate and return score
  158.         //--------------------------------
  159.        
  160.         return $this->calculateGearScore( $character );
  161.     }
  162.    
  163.     public function calculateGearScore( $character )
  164.     {
  165.         //--------------------------------
  166.         // INIT
  167.         //--------------------------------
  168.        
  169.         $GearScore = 0;
  170.        
  171.         foreach ( $character['items'] as $slot => $item )
  172.         {
  173.             //--------------------------------
  174.             // Filter items (Shirt, Tabard)
  175.             //--------------------------------
  176.            
  177.             if ( array_key_exists( $slot, $this->slotMod ) )
  178.             {
  179.                 //--------------------------------
  180.                 // Bearing a 2-hander?
  181.                 //--------------------------------
  182.                
  183.                 if ( $slot == 16 && ! isset( $character['items'][17] ) )
  184.                 {
  185.                     //--------------------------------
  186.                     // Double GS for 2-hander
  187.                     //--------------------------------
  188.                    
  189.                     $item['slot'] = 100;
  190.                 }
  191.                
  192.                 //--------------------------------
  193.                 // Get the specific item's GS
  194.                 //--------------------------------
  195.                
  196.                 $itemScore = $this->getItemScore( $item );
  197.                
  198.                 //--------------------------------
  199.                 // Hunter weapon GS nerf
  200.                 //--------------------------------
  201.                
  202.                 if ( $character['class'] == 3 )
  203.                 {
  204.                     if ( $slot == 16 || $slot == 17 )
  205.                     {
  206.                         $itemScore *= 0.3164;
  207.                     }
  208.                    
  209.                     if ( $slot == 18 )
  210.                     {       
  211.                         $itemScore *= 5.3224;
  212.                     }
  213.                 }
  214.                
  215.                 //--------------------------------
  216.                 // Add to total GS and iLevel
  217.                 //--------------------------------
  218.                
  219.                 $GearScore += $itemScore;
  220.             }
  221.         }
  222.        
  223.         //--------------------------------
  224.         // Negative GS is illegal
  225.         //--------------------------------
  226.        
  227.         if ( $GearScore <= 0 )
  228.         {
  229.             $GearScore = 0;
  230.         }
  231.        
  232.         //--------------------------------
  233.         // Floor the final score
  234.         //--------------------------------
  235.        
  236.         $GearScore = floor( $GearScore );
  237.        
  238.         //--------------------------------
  239.         // Return character GearScore
  240.         //--------------------------------
  241.  
  242.         return $GearScore;
  243.     }
  244.    
  245.     public function getItemScore( $item )
  246.     {
  247.         //--------------------------------
  248.         // INIT
  249.         //--------------------------------
  250.    
  251.         $scale             = 1.8618;
  252.         $itemScore     = 0;
  253.         $qualityScale     = 1;
  254.        
  255.         //--------------------------------
  256.         // Change some variables
  257.         //--------------------------------
  258.        
  259.         if ( $item['rarity'] == 5 )
  260.         {
  261.              $qualityScale         = 1.3;                 
  262.              $item['rarity']     = 4;
  263.         }   
  264.         else if ( $item['rarity'] == 1 || $item['rarity'] == 0 )
  265.         {
  266.             $qualityScale         = 0.005;
  267.             $item['rarity']     = 2;
  268.         }
  269.         else if ( $item['rarity'] == 7 )
  270.         {
  271.             $item['level']         = 187.05;
  272.             $item['rarity']     = 3;
  273.         }
  274.        
  275.         //----------------------------------
  276.         // Use special formula if > 120
  277.         //----------------------------------
  278.  
  279.         if ( $item['level'] > 120 )
  280.         {
  281.             $formula = $this->gsFormula[0];
  282.         }
  283.         else
  284.         {
  285.             $formula = $this->gsFormula[1];
  286.         }
  287.        
  288.         //----------------------------------
  289.         // The actual calculation!
  290.         //----------------------------------
  291.                  
  292.          $itemScore = floor( ( ( $item['level'] - $formula[ $item['rarity'] ][0] ) / $formula[ $item['rarity'] ][1] ) * $this->slotMod[ $item['slot'] ] * $scale * $qualityScale );
  293.        
  294.         if ( $itemScore < 0 )
  295.         {
  296.             $itemScore = 0;
  297.         }
  298.        
  299.         return $itemScore;
  300.     }
  301.    
  302.     public function fatalError( $error )
  303.     {
  304.         print "<h1>GearScore Fatal Error</h1>{$error} Please contact the Webmaster.";
  305.         exit();
  306.     }
  307.    
  308.     public function getCharacterSheet( $character, $realm, $region )
  309.     {
  310.         //--------------------------------
  311.         // INIT
  312.         //--------------------------------
  313.        
  314.         $realm         = trim( urlencode( $realm ) );
  315.         $character = trim( urlencode( $character ) );
  316.        
  317.         if ( ! $character || ! $realm || ! $region )
  318.         {
  319.             $this->fatalError( "Invalid call to getCharacterSheet(): Missing an important parameter!" );
  320.         }
  321.        
  322.         //--------------------------------
  323.         // Build URL
  324.         //--------------------------------
  325.        
  326.         switch( strtolower( $region ) )
  327.         {
  328.             case 'us':
  329.                 $url = "http://www.wowarmory.com/";
  330.             break;
  331.             case 'eu':
  332.                 $url = "http://eu.wowarmory.com/";
  333.             break;
  334.             case 'kr':
  335.                 $url = "http://kr.wowarmory.com/";
  336.             break;
  337.             case 'cn':
  338.                 $url = "http://cn.wowarmory.com/";
  339.             break;
  340.             case 'tw':
  341.                 $url = "http://tw.wowarmory.com/";
  342.             break;
  343.             default:
  344.                 $url = "http://www.wowarmory.com/";
  345.             break;
  346.         }
  347.        
  348.         $url .= "character-sheet.xml?r={$realm}&cn={$character}";
  349.    
  350.         $armory     = parse_url($url);
  351.         $headers     = array();
  352.        
  353.         //--------------------------------
  354.         // Open connection to armory
  355.         //--------------------------------
  356.        
  357.         $transfer = fsockopen( $armory['host'], 80, $errno, $errstr, 5 );
  358.                
  359.         //--------------------------------
  360.         // Set-up headers
  361.         //--------------------------------
  362.        
  363.         $headers[] = "GET {$armory['path']}?{$armory['query']} HTTP/1.0";
  364.         $headers[] = "Host: {$armory['host']}";
  365.         $headers[] = "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
  366.         $headers[] = "Accept-Language: en-us, en;q=0.50";
  367.         $headers[] = "Connection: Close";
  368.        
  369.         //--------------------------------
  370.         // Converge into string
  371.         //--------------------------------
  372.        
  373.         $send = implode( "\r\n", $headers ) . "\r\n\r\n";
  374.        
  375.         //--------------------------------
  376.         // Send headers
  377.         //--------------------------------
  378.        
  379.         fwrite( $transfer, $send );
  380.        
  381.         //--------------------------------
  382.         // Get response XML
  383.         //--------------------------------
  384.        
  385.         while ( $transfer && ! feof( $transfer ) )
  386.         {
  387.             $headerbuffer = fgets($transfer, 1024);
  388.            
  389.             if ( urlencode( $headerbuffer ) == "%0D%0A" )
  390.             {
  391.                 break;
  392.             }
  393.         }
  394.        
  395.         $xml = '';
  396.        
  397.         while ( ! feof( $transfer ) )
  398.         {
  399.             $xml .= fgets( $transfer, 1024 );
  400.         }
  401.        
  402.         //--------------------------------
  403.         // Close connection
  404.         //--------------------------------
  405.        
  406.         fclose( $transfer );
  407.        
  408.         //--------------------------------
  409.         // Return XML
  410.         //--------------------------------
  411.        
  412.         return simplexml_load_string( $xml );
  413.     }
  414. }
  415.  
  416. ?>

Copying code directly through the browser usually breaks the tabbing, so here you can copy the code to paste into your file-editor.

cron