View Single Post
  #1  
Old 09-30-2008, 07:53 PM
Rocker8956
Hill Giant
 
Join Date: Sep 2007
Posts: 117
Default Quest Function get average level ind/group/raid

Below is some code to add a quest function that gets the average level of a character, group, or raid.

I tested it on my server and everything worked.

Anyhow here is the code. Let me know how it works. Hopefully I did not miss anything.

Zone\database.cpp
Append to the end
Code:
int Database::getCharLevel(int charID)
{
    char errbuf[MYSQL_ERRMSG_SIZE];
    char *query = 0;
    MYSQL_RES *result;
    MYSQL_ROW row;
	int level = 0;

	if (RunQuery(query, MakeAnyLenString(&query, "SELECT level FROM character_ WHERE id=%i", charID), errbuf, &result))
	{
		if (mysql_num_rows(result) == 1) 
		{
			row = mysql_fetch_row(result);
			level=atoi(row[0]);
			safe_delete_array(query);
			mysql_free_result(result);
			return level;
		}
		else 
		{
			cerr << "Error in getCharLevel query '" << query << "' " << errbuf << endl;
			safe_delete_array(query);
			mysql_free_result(result);
			return level; // This would return zero
		}
	}
	else 
	{
		cerr << "Error in getCharLevel query '" << query << "' " << errbuf << endl;
		safe_delete_array(query);
		return level; // This would return zero
	}
}

int Database::getRaidAvgLvl(int charID)
{
    char errbuf[MYSQL_ERRMSG_SIZE];
    char *query = 0;
    MYSQL_RES *result;
    MYSQL_ROW row;
	int raidid = 0;
	double levelHolder = 0;

	// Find out what raid the character is in
	if (RunQuery(query, MakeAnyLenString(&query, "SELECT raidid from raid_members where charid=%i", charID), errbuf, &result)) 
	{
		if (mysql_num_rows(result) == 1) 
		{
			row = mysql_fetch_row(result);
			raidid=atoi(row[0]);
			mysql_free_result(result);
			safe_delete_array(query);
			// Select the character IDs of the characters in the raid
			if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid from raid_members where raidid=%i", raidid), errbuf, &result))
			{
				int i = 0; // track number of characters
				while((row = mysql_fetch_row(result))) 
				{
					levelHolder = levelHolder + getCharLevel(atoi(row[0]));
					i++;
				}
				levelHolder = ((levelHolder/i)+.5); // total levels divided by num of characters
				safe_delete_array(query);
				mysql_free_result(result);
				return (int(levelHolder));
			}
			else
			{
				safe_delete_array(query);
				mysql_free_result(result);
				return 0;
			}
		}
		else
		{
			safe_delete_array(query);
			mysql_free_result(result);
			return 0;
		}
	}
	else
	{
		printf("Unable to get raid id: %s\n",errbuf);
		mysql_free_result(result);
		safe_delete_array(query);
		return 0;
	}
}
int Database::getGroupAvgLvl(int charID)
{
    char errbuf[MYSQL_ERRMSG_SIZE];
    char *query = 0;
    MYSQL_RES *result;
    MYSQL_ROW row;
	int groupid = 0;
	double levelHolder = 0;

	// Find out what group the character is in
	if (RunQuery(query, MakeAnyLenString(&query, "SELECT groupid from group_id where charid=%i", charID), errbuf, &result)) 
	{
		if (mysql_num_rows(result) == 1)
		{
			row = mysql_fetch_row(result);
			groupid=atoi(row[0]);
			mysql_free_result(result);
			safe_delete_array(query);
			// Select the character IDs of the characters in the group
			if (RunQuery(query, MakeAnyLenString(&query, "SELECT charid FROM group_id WHERE groupid=%i", groupid), errbuf, &result))
			{
				int i = 0; // track number of characters
				while((row = mysql_fetch_row(result))) 
				{
					levelHolder = levelHolder + getCharLevel(atoi(row[0]));
					i++;
				}
				levelHolder = ((levelHolder/i)+.5); // total levels divided by num of characters
				
				safe_delete_array(query);
				mysql_free_result(result);
				return (int(levelHolder));
			}
			else
			{
				safe_delete_array(query);
				mysql_free_result(result);
				return 0;
			}
		}
		else
		{
			safe_delete_array(query);
			mysql_free_result(result);
			return 0;
		}
	}
	else
	{
		printf("Unable to get group id: %s\n",errbuf);
		mysql_free_result(result);
		safe_delete_array(query);
		return 0;
	}
}
zone\database.h
Insert around line 202
Code:
             int		getCharLevel(int charID);
	int		getRaidAvgLvl(int charID);
	int		getGroupAvgLvl(int charID);
zone\questmgr.cpp
Append to the end
Code:
int QuestManager::getlevel(int charID, int type)
{
	if (type == 0)
	{
		return (database.getCharLevel(charID));
	}
	else if(type == 1)
	{
		return (database.getGroupAvgLvl(charID));

	}
	else if(type == 2)
	{
		return database.getRaidAvgLvl(charID);
	}
	else if(type == 3)
	{
		if(database.getRaidAvgLvl(charID) > 0) 
		{
			return (database.getRaidAvgLvl(charID));
		}
		else if(database.getGroupAvgLvl(charID) > 0) 
		{
			return (database.getGroupAvgLvl(charID));
		}
		else
			return (database.getCharLevel(charID));
	}
	else
		return 0;
}
zone\questmgr.h
Insert around line 149
Code:
int getlevel(int charID, int type);
zone\perlparser.cpp
Insert at the end around line 1884
Code:
newXS(strcpy(buf, "getlevel"), XS__getlevel, file);
zone\perlparser.cpp
Insert around line 1758
Code:
XS(XS__getlevel);
XS(XS__getlevel)
{
    dXSARGS;
    if (items != 2)
        Perl_croak(aTHX_ "Usage: getlevel(charid, type)");

    int		RETVAL;
    dXSTARG;

             int		charid = (int)SvIV(ST(0));
	int		type = (int)SvIV(ST(1));

	RETVAL = quest_manager.getlevel(charid, type);
	XSprePUSH; PUSHu((IV)RETVAL);

	XSRETURN(1);
}
Format for quest function - quest::getlevel(charid, type)
Types
0 = self
1 = group - if in group returns average level of group (if character is not in group this will return zero)
2 = raid - if in raid returns average level of raid (if character in not in raid this will return zero)
3 = If in raid then raid, if not in raid then group, if not in group then self


Simple quest script to show how it works
Code:
sub EVENT_SAY {
$charid = 0;
$charid = $client->CharacterID();
$level = 0;
if($text=~/Hail/i){
	quest::say("Greetings traveler, Do you want to know you average level?"); }
if($text=~/yes/i){
	quest::say("Oh wonderful! Do you want to know the average level of yourself, group, or raid?"); }
if($text=~/self/i){
	$level = quest::getlevel($charid, 0); 
	quest::say("Your level is $level.");}
if($text=~/group/i){
	$level = quest::getlevel($charid, 1);
	quest::say("Your group average level is $level."); }
if($text=~/raid/i){
	$level = quest::getlevel($charid, 2);
	quest::say("Your raid average level is $level."); }
if($text=~/guess/i){
	$level = quest::getlevel($charid, 3);
	quest::say("I guess your level is $level."); }
}
Reply With Quote