Copy the code below and paste it into a .php text file.
Save and upload to your web server.
Open script in browser.
*******************
<?php
/*
* classesxml.php
* a Dark Age of Camelot Guild XML data parser that returns a guild roster
* sorted by class
* for use on Dark Age of Camelot community websites.
*
* Dark Age of Camelot (or DAoC) is a MMORPG
* (massively multiplayer online rolepaying game)
* developed by Mythic Entertainment (http://www.mythicentertainment.com)
*
* Author: Julien COQUET
* a.k.a Glenfiddich Singlemalt on DAoC Merlin/Albion
* e-mail glenfiddich@purpledragons.net
* http://www.purpledragons.net
*
* Adapted from generic PHP code from http://www.php.net
*
* Developed in November of 2002 under the GNU GPL License.
* For more information, visit http://www.gnu.org/licenses/gpl.html
*
* Enjoy and please link to our site
* http://www.purpledragons.net
*
* Changelog:
* March 28, 2003 : added UTF8 support for GOA XML - Euro servers only
* Feb. 25, 2003 : finally added $param as $_GET['param']
*/
class guildXML {
/*
* This class takes a Dark Age of Camelot Herald XML guild data file and parses it
*/
var $xml_parser;
var $xml_file;
var $html;
var $open_tag ;
var $close_tag ;
var $in_char;
var $in_alliance;
var $chars_array;
var $alliance_array;
var $current_tag ='';
/*
* Class Constructor
*/
function guildXML() {
$this->xml_parser = "";
$this->xml_file = "";
$this->html = "";
}
//Class Destructor (has to be invoked manually as PHP does not support destructors)
function destroy() {
xml_parser_free($this->xml_parser);
}
//Class Members
function concat($str) {
$this->html .= $str;
}
function startElement($parser, $name, $attrs) {
global $totalchars, $num_activechars,$num_inactivechars, $insideElement, $in_char, $current_tag, $i;
if (($in_char==1)||($in_alliance==1)){
$current_tag = $name;
}
if ($name=='GUILD'){
$current_tag= $name;
if (sizeof($attrs)) {
while (list($k, $v) = each($attrs)) {
if ($k=='GUILDRP'){$this->guildrp=$v;};
if ($k=='TIMESTAMP'){$this->timestamp=$v;};
}
}
}
if ($name=='CHARACTER'){
$in_alliance = 1;
}
if ($name=='CHARACTER'){
$in_char=1;
$totalchars++;
if (sizeof($attrs)) {
while (list($k, $v) = each($attrs)) {
if ($k=='NAME'){$this->chars_array[$i]['name']=$v;};
if ($k=='ID'){$this->chars_array[$i]['id']=$v;};
if ($k=='LASTON') {
$this->chars_array[$i]['laston']=$v;
if ($v!='Inactive') {
$num_activechars++;
} elseif($v=='Inactive'){
$num_inactivechars++;
}
}
}
}
}
}
function endElement($parser, $name) {
global $close_tag, $current_tag, $in_char, $i;
if ($name=='CHARACTER'){$i++; $in_char=0;}
if ($name=='ALLIANCE'){$i++; $in_alliance=0;}
}
function characterData($parser, $data) {
global $guildrp, $inactiverp, $current_tag, $in_char, $i;
//$content_output .= '<br>'.$current_tag.' = '.$data.'<br>';
if (($in_char==1) && ($current_tag=='RACE')){
$this->chars_array[$i]['race'].=$data;
}
if (($in_char==1) && ($current_tag=='CLASS')){
$this->chars_array[$i]['class'].=$data;
}
if (($in_char==1) && ($current_tag=='LEVEL')){
$this->chars_array[$i]['level'].=$data;
}
if (($in_char==1) && ($current_tag=='TOTALRP')){
$this->chars_array[$i]['rp'].=$data;
if ($this->chars_array[$i]['laston']=='Inactive'){
$inactiverp += $data;
} else {
$guildrp += $data;
}
}
if (($in_char==1) && ($current_tag=='GUILDRANK')){
$this->chars_array[$i]['guildrank'].=$data;
}
//$this->html .= $data;
}
function parse() {
$this->xml_parser = xml_parser_create();
xml_set_object($this->xml_parser, &$this);
// use case-folding so we are sure to find the tag in $map_array
xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, true);
xml_set_element_handler($this->xml_parser, "startElement", "endElement");
xml_set_character_data_handler($this->xml_parser, "characterData");
//xml_set_processing_instruction_handler($this->xml_parser, "PIHandler");
if (!($fp = fopen($this->xml_file, "r"))) {
die("could not open XML input");
}
while ($data = fread($fp, 4096)) {
if (!xml_parse($this->xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->xml_parser)),
xml_get_current_line_number($this->xml_parser)));
}
}
}
}
// End of class
// Support functions
/*
* The function sortItems() is used for sorting, called upon by uksort()
* It uses querystring parameter $param as the sorting parameter
* querystring parameter $dir indicates ascending or descending order
*/
function sortItems($a, $b) {
global $gu, $dir, $param;
$val_a = ($gu[$a][$param]);
$val_b = ($gu[$b][$param]);
if (!$param){$param='level';}
if (!$dir){$dir='down';}
switch ($param){
case 'rp':
$val_a = $val_a - 0;
$val_b = $val_b - 0;
break;
case 'level':
$val_a = $val_a - 0;
$val_b = $val_b - 0;
break;
}
if ($dir=='up'){
if ( $val_a > $val_b ){return 1;}
if ( $val_a < $val_b ){return -1;}
if ( $val_a = $val_b ){return 0;}
} else {
if ( $val_a < $val_b ){return 1;}
if ( $val_a > $val_b ){return -1;}
if ( $val_a = $val_b ){return 0;}
}
}
/*
* returns array with Guild Rank information
*/
function guildrank($rank){
switch ($rank){
case 0: $rankname = array('Guildmaster', 'Description for Guildmaster');
break;
case 1: $rankname = array('Rank 1 Title', 'Description for Guild Rank 1');
break;
case 2: $rankname = array('Rank 2 Title', 'Description for Guild Rank 2');
break;
case 3: $rankname = array('Rank 3 Title', 'Description for Guild Rank 3');
break;
case 4: $rankname = array('Rank 4 Title', 'Description for Guild Rank 4');
break;
case 5: $rankname = array('Rank 5 Title', 'Description for Guild Rank 5');
break;
case 6: $rankname = array('Rank 6 Title', 'Description for Guild Rank 6');
break;
case 7: $rankname = array('Rank 7 Title', 'Description for Guild Rank 7');
break;
case 8: $rankname = array('Rank 8 Title', 'Description for Guild Rank 8');
break;
case 9: $rankname = array('Rank 9 Title', 'Description for Guild Rank 9');
break;
}
return $rankname;
}
/*
* returns Realm Rank/Level
*/
function realmlevel ($rp){
$rap =1;
for ($i=1; $i<11; $i++){
if ($i!=1){
for ($j=0;$j<10;$j++){
$rp_needed = ((25/3)*(pow($rap,3))) - ((25/2)*(pow($rap,2))) + ((25/6)*$rap);
if ($rp_needed <10) {
$rp_needed =0;
}
if ($rp>=$rp_needed) {
$level = 'R'.$i.'L'.$j;
}
$rap++;
}
} else {
for ($j=1;$j<10;$j++){
$rp_needed = ((25/3)*(pow($rap,3))) - ((25/2)*(pow($rap,2))) + ((25/6)*$rap);
if ($rp_needed <10) {
$rp_needed =0;
}
if ($rp>=$rp_needed) {
$level = 'R'.$i.'L'.$j;
}
$rap++;
}
}
}
return $level;
}
/*
* returns Realm Title
*/
function realmtitle($rp){
/*
* You start at Rank 1. To rise to Rank 2, you need 7125 realm points.
* Rank 3 = 61750, Rank 4 = 213875, Rank 5 = 513500, Rank 6 = 1010625, Rank 7 = 1755250, Rank 8 = 2797375, Rank 9 = 4187000
* and finally Rank 10 = 5974125
*
* These ranks are for the Albion Realm. You need to add correct values for Hibernia or Midgard.
* The list of ranks per realm can be found at http://www.purpledragons.net/camelot/rp_chart.php
*/
if ($rp >=0) $title= 'Guardian';
if ($rp > 7125) $title = 'Warder';
if ($rp > 61750) $title = 'Myrmidon';
if ($rp > 213875) $title = 'Gryphon Knight';
if ($rp > 513500) $title = 'Eagle Knight';
if ($rp > 1010625) $title = 'Phoenix Knight';
if ($rp > 1755250) $title = 'Alerion Knight';
if ($rp > 2797375) $title = 'Unicorn Knight';
if ($rp > 4187000) $title = 'Lion Knight';
if ($rp > 5974125) $title = 'Dragon Knight';
return $title;
}
// Main content
$guild = new guildXML(); //instantiate class
$guild->xml_file = "http://www.camelotherald.com/guilds/Merlin/804.xml";
// the xml_file property referes to you guild XML data file.
// Example given is the Merlin/Albion guild Dragon's Blood
$server="Merlin";
$herald_char_url ="http://www.camelotherald.com/chardisplay.php";
$guild->parse();
// Copy some variables
$gu = $guild->chars_array;
$guildrp = $guild->guildrp;
$guildtimestamp = $guild->timestamp;
$xml_file = $guild->xml_file;
$guild->destroy(); // destroy the object
$param = $_GET['param']; // retrieve sort parameter from URL querystring
uksort($gu, "sortItems"); // call upon sortItems() to sort the guild information array
reset($gu);
/*
* This arrays lists all Albion Classes, modify to match your realm!
* Keep in mind some classes like Armsman have a feminine classname as well!
*/
$classes = array(
array ('Armsman','Armswoman'),
array ('Cabalist',''),
array ('Cleric',''),
array ('Friar',''),
array ('Infiltrator',''),
array ('Mercenary',''),
array ('Minstrel',''),
array ('Necromancer',''),
array ('Paladin',''),
array ('Reaver',''),
array ('Scout',''),
array ('Sorcerer',''),
array ('Theurgist',''),
array ('Wizard','')
);
// Generates a navigation bar
foreach ($classes as $key=>$value){
$y++;
$text_link .= '<span style="font-size:8pt;"> <a href="#'.strtolower($value[0]).'">'.$value[0].'</a> </span>';
if ($y<count($classes)) {
$text_link .='|';
}
}
function outputClassList($classname,$classname_fem='',$navbar=1){
global $gu, $text_link, $server, $herald_char_url;
$header = '<a name="'.strtolower($classname).'"></a>';
$header .= '<table cellspacing="0" cellpadding="3" width="100%">
';
$header .= ' <tr>
';
$header .= ' <td colspan="4"><h3>'.strtolower($classname).'</h3></td>';
$header .= ' </tr>
';
if ($navbar) {
$footer = '<tr bgcolor="#FFFFFF"><td colspan="4" align="right">'.$text_link.'</td></tr></table>'."\n";
} else {
$footer ='</table>';
}
foreach ($gu as $key=>$value){
if (trim($value['class'])==$classname || trim($value['class'])==$classname_fem){
$num++;
if ($num %2 ==0){
$bgcolor ='#FFFFFF';
} else {
$bgcolor ='#E5E5E5';
}
$output .= '<tr bgcolor="'.$bgcolor.'" style="margin-top:3px;margin-left:3px;">';
$output .= '<td nowrap="true" style="font-size:9pt;" width="40%"><b><a href="'.$herald_char_url.'?s='.$server.'&c='.$value['id'].'" target="blank" title="view '.$value['firstname'].'\'s Herald page">'.$value['name'].'</a></b></td>';
$output .= '<td nowrap="true" style="font-size:9pt;" width="20%" align="right">lvl. '.$value['level'].' '.$value['class'].'</td>';
$output .= ($value['level']>=20) ? '<td align="right" nowrap="true" style="font-size:9pt;" width="20%" align="right">'.$value['rp'].' RP</td>' : '<td style="font-size:9pt;"> </td>';
$output .= ($value['level']>=20) ? '<td nowrap="true" style="font-size:9pt;" width="20%" align="right">'.realmtitle($value['rp']).'</td>':'<td style="font-size:9pt;"> </td>';
$output .= '</tr>'."\n";
}
}
if ($num++){
return $header . $output . $footer;
} else {
return null;
}
}
$form .='
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tr>
<FORM ACTION="'.$PHP_SELF.'" METHOD="POST">
<td colspan="4" valign="center">
<br>
<select name="class" onChange="if(this.value==\'X\'){return false;}">
<option value="0">All classes</option>
<option value="X">-----------</option>';
foreach ($classes as $key=>$value){
$form .='
<option value="'.$value[0].'">'.$value[0].'</option>';
}
$form .='
</select> <input type="submit" name="submit">
<br>
</td>
</FORM>
</tr>
</table>
';
if ($_POST['class']) { // checked vor value passed thru drop down menu
// generate list for chosen class
$content_output .= outputClassList($_POST['class'],'',0);
$content_output .= $form;
} else {
// generates list for all classes
foreach ($classes as $key=>$value){
$content_output .=outputClassList($value[0],$value[1],1);
}
$content_output .= $form;
}
/*
For Euro guilds: uncomment the following instructions
*/
// $content_output = utf8_decode($content_output); // handles UTF8 character encoding
print $content_output; // outputs our class list
?>