Rocker8956
09-30-2008, 07:53 PM
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
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
int getCharLevel(int charID);
int getRaidAvgLvl(int charID);
int getGroupAvgLvl(int charID);
zone\questmgr.cpp
Append to the end
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
int getlevel(int charID, int type);
zone\perlparser.cpp
Insert at the end around line 1884
newXS(strcpy(buf, "getlevel"), XS__getlevel, file);
zone\perlparser.cpp
Insert around line 1758
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
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."); }
}
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
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
int getCharLevel(int charID);
int getRaidAvgLvl(int charID);
int getGroupAvgLvl(int charID);
zone\questmgr.cpp
Append to the end
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
int getlevel(int charID, int type);
zone\perlparser.cpp
Insert at the end around line 1884
newXS(strcpy(buf, "getlevel"), XS__getlevel, file);
zone\perlparser.cpp
Insert around line 1758
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
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."); }
}